2012-07-14 19 views
9

नहीं दिखाता है मुझे विंडोज 8 रिलीज पूर्वावलोकन (नवीनतम पैच स्थापित) का उपयोग करके, मेरे WinRT/C# XAML मेट्रो ऐप में एक अजीब समस्या है।कॉम्बोबॉक्स चयनित वैल्यू

<ComboBox SelectedValue="{Binding MySelectedValue, Mode=TwoWay}" 
      ItemsSource="{Binding MyItemsSource, Mode=OneWay}" 
      Width="200" Height="30" /> 

कोड के पीछे:: ​​मैं एक ComboBox, जिनके मान ItemsSource और SelectedValue एक ViewModel में संपत्तियों के लिए बाध्य कर रहे हैं का उपयोग कर रहा

public MainPage() 
{ 
    this.InitializeComponent(); 

    DataContext = new TestViewModel(); 
} 

और TestViewModel की एक बहुत ही सरल परिभाषा, तार का उपयोग कर:

public class TestViewModel : INotifyPropertyChanged 
{ 
    public event PropertyChangedEventHandler PropertyChanged; 

    private IEnumerable<string> _myItemsSource = new List<string> 
     { 
      "Test Item 1", 
      "Test Item 2", 
      "Test Item 3" 
     }; 
    public IEnumerable<string> MyItemsSource 
    { 
     get { return _myItemsSource; } 
    } 

    private string _mySelectedValue = "Test Item 2"; 
    public string MySelectedValue 
    { 
     get { return _mySelectedValue; } 
     set 
     { 
      _mySelectedValue = value; 
      if (PropertyChanged != null) 
      { 
       PropertyChanged(this, new PropertyChangedEventArgs("MySelectedValue")); 
      } 
     } 
    } 
} 

अब मैंने सोचा कि यह सरल समाधान सिर्फ काम करना चाहिए ... लेकिन जब मैं ऐप शुरू करता हूं, SelectedValue="Test Item 2" दिखाई नहीं देता है, ComboBox खाली छोड़ दिया गया है। ब्रेकपॉइंट्स सेट करके मैंने देखा कि MyItemsSource और MySelectedValue बाध्य मान दृश्य मॉडल से मूल रूप से पुनर्प्राप्त किए गए हैं जब मैं दृश्य के DataContext सेट करता हूं। इस क्रिया के बाद, ComboBox.SelectedValue संपत्ति वास्तव में "Test Item 2" पर सेट है, लेकिन यह अभी प्रदर्शित नहीं होती है! साथ ही मैंने देखा कि जब मैं यूआई पर उपयोगकर्ता कार्रवाई द्वारा कॉम्बोबॉक्स में चयनित मान बदलता हूं, तो परिवर्तित मूल्य कॉम्बोबॉक्स में दिखाई देता है और व्यू मॉडल प्रॉपर्टी तदनुसार अपडेट की जाती है। तो MySelectedValue के प्रारंभिक विज़ुअलाइजेशन को छोड़कर मॉडल प्रॉपर्टी को छोड़कर सबकुछ ठीक काम करता प्रतीत होता है। मैं इसके बारे में वास्तव में हताश हो रहा हूं ...

अब यह सबसे सरल उदाहरण है, मूल में मैं कॉम्बोबॉक्स में पूरी संस्थाओं को बांधना चाहता था, DisplayMemberPath और SelectedValuePath सेट करना चाहता था। दुर्भाग्य से, एक ही समस्या होती है।

+0

क्या यह आपके लिए काम है ??? –

+0

क्या समस्या तब बनी रहती है जब आप संग्रह से वास्तविक तत्व प्राप्त करते हैं, बजाय चयनित 'में एक नई स्ट्रिंग "निर्दिष्ट करने के बजाय,' चयनित वैल्यू = आइटम स्रोत [1] 'में? – Patrick

उत्तर

29

मैं अपने उदाहरण में समस्या का पता चला है: XAML मार्कअप में मैं SelectedValue संपत्ति परिभाषित किया है ItemsSource संपत्ति से पहले। अगर मैं इस तरह से दोनों परिभाषाओं को स्वैप करता हूं, तो यह काम करता है:

<ComboBox ItemsSource="{Binding MyItemsSource, Mode=OneWay}" 
     SelectedValue="{Binding MySelectedValue, Mode=TwoWay}" 
     Width="200" Height="30" /> 

यह वास्तव में अजीब और परेशान है। अब मैं जानना चाहूंगा: क्या यह एक बग है या डिजाइन द्वारा? मुझे लगता है कि यह एक बग है, क्योंकि नियंत्रण XAML में परिभाषित गुणों के क्रम के बावजूद काम करना चाहिए।

+0

यह सिल्वरलाइट 2. के बाद से था। –

+0

टिप के लिए धन्यवाद। मैं वर्षों से सिल्वरलाइट/डब्ल्यूपीएफ/विंडोज 8 का उपयोग कर रहा हूं और बाध्यकारी मामलों के आदेश को कभी नहीं देखा। हाल ही में मैंने विंडोज 8 ऐप के विकास के दौरान इस मुद्दे में भाग लिया, मुझे 'चयनित वैल्यू' का एहसास करने के लिए कुछ समय लगा, 'आइटमसोर्स' बाध्यकारी से पहले था। –

+0

वास्तव में? मुझे नहीं लगता कि यह mattered –

2

इस काम कर रहा है समाधान: आप यहां पा सकते हैं https://skydrive.live.com/?cid=b55690d11b67401d&resid=B55690D11B67401D!209&id=B55690D11B67401D!209

<ComboBox Width="300" Height="32" HorizontalAlignment="Left" DisplayMemberPath="Name" 
        VerticalAlignment="Top" ItemsSource="{Binding PersonCollection}" 
        SelectedItem="{Binding SelectedPerson, Mode=TwoWay}"></ComboBox> 

ViewModle वर्ग

public class ViewModel:BaseViewModel 
    { 
     private Person selectedPerson; 
     public Person SelectedPerson { 
      get { return this.selectedPerson; } 
      set { this.selectedPerson = value; 
      this.RaisePropertyChanged("SelectedPerson"); 
      } 
     } 
     public ObservableCollection<Person> PersonCollection { get; set; } 

     public ViewModel() 
     { 
      this.PersonCollection = new ObservableCollection<Person>(); 
      this.PopulateCollection(); 

      //setting first item as default one 
      this.SelectedPerson = this.PersonCollection.FirstOrDefault(); 
     } 

     private void PopulateCollection() 
     { 
      this.PersonCollection.Add(new Person { Name="Oscar", Email="[email protected]" }); 
      this.PersonCollection.Add(new Person { Name = "Jay", Email = "[email protected]" }); 
      this.PersonCollection.Add(new Person { Name = "Viral", Email = "[email protected]" }); 
     } 
    } 
संबंधित मुद्दे