2009-07-14 5 views
7

बदल मैं दो ListBox तों बाध्य करने के लिए कोशिश कर रहा हूँ:ListBox संपत्ति के बाद ताज़ा नहीं है

<ListBox SelectionChanged="lbApplications_SelectionChanged" 
     ItemsSource="{Binding Path=Applications, 
         UpdateSourceTrigger=PropertyChanged, Mode=OneWay}" /> 
<ListBox DisplayMemberPath="Message" 
     ItemsSource="{Binding Path=Events, 
         UpdateSourceTrigger=PropertyChanged, Mode=OneWay}" /> 

Applications और EventsWindow कक्षा में सार्वजनिक संपत्ति हैं।

मैं दोनों सूची बक्से को this को DataContext सेट और Window कक्षा में INotifyPropertyChanged लागू:

private void NotifyPropertyChanged(string info) 
{ 
    if (PropertyChanged != null) 
    PropertyChanged(this, new PropertyChangedEventArgs(info)); 
} 

और फिर Applications या Events करने के लिए नए आइटम जोड़ने के बाद मैं फोन:

NotifyPropertyChanged("Events"); 
NotifyPropertyChanged("Applications"); 

मुद्दा है कि ListBox केवल एक बार लोड किया गया है। मैं क्या गलत कर रहा हूं?

उत्तर

11

चलो बस सूची बॉक्स में से एक को देखें, क्योंकि वे दोनों मूल रूप से समान हैं।

कोड हम बारे में चिंतित हैं यह है:

<ListBox ItemsSource="{Binding Path=Applications, 
          UpdateSourceTrigger=PropertyChanged, Mode=OneWay}" /> 

जब से तुम WPF लिए नए हैं, मुझे कहते हैं कि तुम शायद UpdateSourceTrigger या Mode वहाँ में की जरूरत नहीं है, जो हमें इस के साथ छोड़ देता है करते हैं:

<ListBox ItemsSource="{Binding Path=Applications}" /> 

आपने बताया कि अनुप्रयोग आपके कोड-पीछे में एक सार्वजनिक संपत्ति है। आपको इसे DependencyProperty होने की आवश्यकता है, और इसे बदलने के दौरान आपको ईवेंट को आग लगाना होगा - अधिकांश लोग इसके लिए ObservableCollection का उपयोग करते हैं।

तो अपने कोड-पीछे कुछ इस तरह होगा:, अंत में

this.Applications = new ObservableCollection<string>(); 
Applications.Add("Whatever"); 

:

public ObservableCollection<string> Applications 
{ 
    get { return (ObservableCollection<string>)GetValue(ApplicationsProperty); } 
    set { SetValue(ApplicationsProperty, value); } 
} 

public static readonly DependencyProperty ApplicationsProperty = 
    DependencyProperty.Register("Applications", 
    typeof(ObservableCollection<string>), typeof(Window1), 
    new UIPropertyMetadata(null)); 

फिर, जहां आप इसे जोड़ना चाहते हैं तो आपको कुछ ऐसा करना होगा, XAML में काम करने के लिए "सरल" बाध्यकारी वाक्यविन्यास के लिए, मैं आमतौर पर DataContext को अपनी विंडो में (या फ़ाइल के लिए रूट नियंत्रण तत्व, जो भी मैं काम कर रहा हूं)

में बदलता हूं
<Window DataContext="{Binding RelativeSource={RelativeSource Self}}" ... > 
    ... 

आपका एप्लीकेशन बॉक्स स्वचालित रूप से अपडेट हो जाएगा।

+0

धन्यवाद। यह काम करता है, लेकिन केवल musst सूची बॉक्स datacontext = यह या ElementName = विंडो {बाइंडिंग} में सेट किया जाना चाहिए। –

+0

अच्छा बिंदु। मैंने जवाब अपडेट किया। – exclsr

+3

आपको अपने संग्रह को बनाने की आवश्यकता नहीं है, आप एक निर्भरता संपत्ति के लिए बाध्यकारी हैं - जब तक यह एक पर्यवेक्षण चयन और संग्रह में प्रकार लागू करता है IotifyPropertyChanged – flobadob

3

समस्या यह है कि आपकी संपत्ति का मूल्य नहीं बदला है। यह अभी भी वही सूची है, वही संदर्भ।

एक समाधान यह हो सकता है कि आपके संग्रह ObservableCollection प्रकार के हैं। जब आप आइटम जोड़ते या निकालते हैं तो ये सूचियां WPF के लिए ईवेंट प्रदान करती हैं।

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

  • कोई संबंधित समस्या नहीं^_^