9

मैंने विंडोज फोन 7 के लिए एक ऐप लिखा है, हाल ही में मैंने इसे विंडोज फोन 8 में अपग्रेड कर दिया है और मैं कुछ विशेषताओं को जोड़ने की योजना बना रहा हूं। दुर्भाग्य से, मैं अपग्रेड के तुरंत बाद एक समस्या में भाग गया है। ऐप का मुख्य भाग पैनोरमा नियंत्रण है जो डाटाबेस है। चयन पर मैं नए पैनोरमाइटम + 1 के लिए डेटा ला रहा हूं (डेटा को पूर्व निर्धारित करना, इसलिए जब व्यक्ति अंततः आइटम पर जाता है)। यह WP7 में ठीक काम करता है लेकिन चयन परिवर्तन घटना WP8 के साथ नहीं आती है।विंडोज फोन 8 पैनोरामा चयन चेंज और डाटाबेसिंग

मैंने इस मुद्दे को एक नए WP8 ऐप के साथ पुन: उत्पन्न किया है जिसे अपग्रेड नहीं किया गया था और यह डाटाबेस नियंत्रणों के लिए भी अलग है। यदि मैं स्थिर रूप से पैनोरमा इटम्स चुनता हूं तो चयन बदलें घटना ठीक हो जाती है।

क्या मुझे कुछ याद आ रहा है या यह WP8 में सिर्फ एक सीधी बग है? कोई भी सिफारिश की काम-आसपास?

मेरे पास एक स्थिर नमूना और एक डाटाबेस नमूना के साथ एक गिटहब रेपो है जो यह दिखाने के लिए कि क्या काम करता है और क्या काम नहीं करता है। https://github.com/bthubbard/DatabindingIssues

उत्तर

18

WP8 में पैनोरमा नियंत्रण एक ज्ञात डेटाबेसिंग बग है। बग के लक्षण यह हैं कि चयन चेंज नहीं किया जाता है, चयनित इंडेक्स & चयनित इटैम विश्वसनीय नहीं है और पैनोरमा के साथ एक पृष्ठ में वापस नेविगेशन पैनोरमा चयनित आइटम को रीसेट करता है।

उदाहरण के लिए, निम्न कोड नमूना कभी भी संदेशबॉक्स और चयनित इंडेक्स & को फ़ायर नहीं करेगा चयनित इटैम सही अपेक्षित मानों को इंगित नहीं करेगा।

<phone:Panorama x:Name="panorama" 
       ItemsSource="{Binding}" 
       SelectionChanged="Panorama_SelectionChanged_1"> 
    <phone:Panorama.HeaderTemplate> 
     <DataTemplate> 
      <ContentControl Content="{Binding Name}" /> 
     </DataTemplate> 
    </phone:Panorama.HeaderTemplate> 
    <phone:Panorama.ItemTemplate> 
     <DataTemplate> 
      <ContentControl Content="{Binding Name}" /> 
     </DataTemplate> 
    </phone:Panorama.ItemTemplate> 
</phone:Panorama> 
private void MainPage_Loaded(object sender, RoutedEventArgs e) 
{ 
    this.DataContext = new ObservableCollection<Cow>() 
          { 
           new Cow("Foo"), 
           new Cow("Bar"), 
           new Cow("Baz") 
          }; 
} 

private void Panorama_SelectionChanged_1(object sender, SelectionChangedEventArgs e) 
{ 
    MessageBox.Show("Panorama_SelectionChanged_1: " + panorama.SelectedIndex); 
} 

public class Cow 
{ 
    public Cow(string name) 
    { 
     Name = name; 
    } 

    public string Name { get; set; } 
} 

एक स्पष्ट ठीक मैन्युअल में कोड-पीछे PanoramaItems प्रारंभ करने में किया जाएगा।

एक और समाधान हमारे संग्रह को टाइप किए गए से अलग करने के लिए बदलना होगा, और हमारे कोडित डेटा वर्ग में निम्न कोड स्निपेट जोड़ें। तो चलो ObservableCollection<object> को ObservableCollection<Cow> से हमारे कोड बदल सकते हैं और Cow वर्ग के लिए कुछ कोड जोड़ने:

:

private void MainPage_Loaded(object sender, RoutedEventArgs e) 
{ 
    this.DataContext = new ObservableCollection<object>() 
          { 
           new Cow("Foo"), 
           new Cow("Bar"), 
           new Cow("Baz") 
          }; 
} 

public class Cow 
{ 
    public Cow(string name) 
    { 
     Name = name; 
    } 

    public string Name { get; set; } 

    public override bool Equals(object obj) 
    { 
     if ((obj != null) && (obj.GetType() == typeof(PanoramaItem))) 
     { 
      var thePanoItem = (PanoramaItem)obj; 

      return base.Equals(thePanoItem.Header); 
     } 
     else 
     { 
      return base.Equals(obj); 
     } 
    } 

    public override int GetHashCode() 
    { 
     return base.GetHashCode(); 
    } 
} 

अब, जब हम इस कोड स्निपेट हम SelectionChanged आग देख सकते हैं सही SelectedIndex मूल्यों के साथ अपेक्षित तरीके से चलना जो एक पोर्टेबल कक्षा लाइब्रेरी में ViewModel है किसी के लिए भी Panorama firing the SelecitonChanged event with the correct SelectedIndex Panorama firing the SelecitonChanged event with the correct SelectedIndex

+3

आपकी प्रतिक्रिया के लिए धन्यवाद। आप एक छोटे से ऐप पर काम करते हैं, लेकिन कुछ और शामिल होने के साथ दर्द का थोड़ा सा हो सकता है। कोई विचार जब यह तय किया जाएगा? – Brandon

+0

मैंने अभी परीक्षण किया है और अब चयन परिवर्तन घटना अब WP8 में काम कर रही है। – Sopuli

2

बस एक छोटी सी टिप - मैं अपने ViewModels के लिए आधार वर्ग में इस कोड डाल:

if (Equals(obj.GetType().Name, "PanoramaItem")) 
{ 
    var datacontextProperty = obj.GetType().GetRuntimeProperty("DataContext"); 
    var datacontext = datacontextProperty.GetValue(obj); 
    return Equals(datacontext, this); 
} 

इससे मेरे लिए समस्या हल हो गई। @ सोपुली की टिप्पणी के लिए - मुझे निश्चित रूप से अभी भी WP8 डिवाइसों पर यह समस्या है जो मैंने परीक्षण किया है। (नोकिया लूमिया 920, WP8.0.10517.150)


एक VB.NET संस्करण:

Public Overrides Function Equals(obj As Object) As Boolean 
    If Equals(obj.GetType.Name, "PanoramaItem") Then 
     Dim datacontextProperty = System.Reflection.RuntimeReflectionExtensions.GetRuntimeProperty(obj.GetType, "DataContext") 
     Dim datacontext = datacontextProperty.GetValue(obj) 
     Return Equals(datacontext, Me) 
    Else 
     Return MyBase.Equals(obj) 
    End If 
End Function 
+0

क्षमा करें, आपने इसे अपने पीसीएल वीएम में कहां रखा? किसी प्रकार की 'बाइंडेबलबेस' कक्षा के निर्माता में जो 'INotifyChanged' लागू करता है? –

+0

मेरे व्यूमोड पीसीएल में हैं। वे सभी एक ViewModelBase वर्ग (पीसीएल में alsin) से विरासत में हैं। उपरोक्त कोड बराबर ऑपरेटर का हिस्सा है: – espenalb

+0

बिल्कुल सही। मैंने आपके सी # कोड का एक वीबी.NET संस्करण जोड़ा है क्योंकि यह थोड़ा अलग है। –

संबंधित मुद्दे