2013-10-24 17 views
6

मैं WPF के लिए नया हूं।संग्रह बदलते समय WPF Combobox अद्यतन नहीं हो रहा है

मैं combobox के लिए स्ट्रिंग का संग्रह बांधने की कोशिश कर रहा हूँ।

public ObservableCollection<string> ListString {get; set;} 

बाध्यकारी और DataContext के रूप में इस प्रकार है

<Window 
     x:Class="Assignment2.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:validators="clr-namespace:Assignment2" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     Title="MainWindow" Height="350" Width="525" 
     DataContext="{Binding RelativeSource={RelativeSource Self}, Path=.}"> 
    <Grid> 
     <ComboBox Height="23" HorizontalAlignment="Left" Margin="109,103,0,0" Name="StringComboBox" VerticalAlignment="Top" Width="120" SelectionChanged="StringComboBox_SelectionChanged"> 
      <ComboBox.ItemsSource> 
       <Binding Path="ListString" BindsDirectlyToSource="True" Mode="TwoWay" UpdateSourceTrigger="PropertyChanged"></Binding> 
      </ComboBox.ItemsSource> 
     </ComboBox> 

मुझे पता है कि इस वजह से संग्रह अपडेट कर रहा है हो रहा है आया सेट कर रहे हैं। अगर मैं लिखना

public MainWindow() 
     { 

      InputString = ""; 
      ListString = new ObservableCollection<string>(); 
      ListString.Add("AAA"); 
      ListString.Add("BBB"); 
      ListString.Add("CCC"); 
      InitializeComponent(); 

     } 

यह काम करता है लेकिन अगर मैं पहली पंक्ति में ऊपर ले जाने के InitializeComponent() इस प्रकार हूँ, यह काम नहीं करता।

public MainWindow() 
      { 
       InitializeComponent(); 
       InputString = ""; 
       ListString = new ObservableCollection<string>(); 
       ListString.Add("AAA"); 
       ListString.Add("BBB"); 
       ListString.Add("CCC");     
      } 

मुझे क्या करना चाहिए ??

+1

एक कार्य और दूसरा नहीं है। मैं उस विकल्प के साथ जाऊंगा जो काम करता है। – Paparazzi

+1

@ ब्लाम मैं अपनी समस्या को हल करने के लिए इस समस्या को सामान्य बनाने की कोशिश कर रहा हूं जिसमें डब्ल्यूसीएफ सेवा से सूची आ रही है। फिर भी आप उस विकल्प के साथ जाने का सुझाव देते हैं जो काम करता है ?? –

उत्तर

9

समस्या हल हो गई। कार्यान्वित INotifyPropertyChanged के रूप में इस प्रकार है

public partial class MainWindow : Window, INotifyPropertyChanged 

accessors संशोधित रूप में

private ObservableCollection<string> listString; 
    public ObservableCollection<string> ListString 
    { 
     get 
     { 
      return listString; 
     } 
     set 
     { 
      listString = value; 
      NotifyPropertyChanged("ListString"); // method implemented below 
     } 
    } 

अनुसरण करता है और घटना

public event PropertyChangedEventHandler PropertyChanged; 
public void NotifyPropertyChanged(string name) 
{ 
    if (PropertyChanged != null) 
    { 
     PropertyChanged(this,new PropertyChangedEventArgs(name)); 
    } 
} 

बढ़ाने के लिए निम्न इवेंट और विधि जोड़कर उसे यह बी)

0

अगर आप

<Window 
    x:Class="Assignment2.MainWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:validators="clr-namespace:Assignment2" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    Title="MainWindow" Height="350" Width="525"> 
<Grid> 
    <ComboBox Height="23" HorizontalAlignment="Left" Margin="109,103,0,0" Name="StringComboBox" VerticalAlignment="Top" Width="120" SelectionChanged="StringComboBox_SelectionChanged" 
       ItemsSource="{Binding ListString, Mode=OneWay}"/> 

सीएस के लिए अपने कोड बदल क्या होता है।

public MainWindow() 
     { 
      InitializeComponent(); 
      InputString = ""; 
      ListString = new ObservableCollection<string>(); 
      ListString.Add("AAA"); 
      ListString.Add("BBB"); 
      ListString.Add("CCC"); 

      this.DataContext=this;  
     }   

Btw: मोड के साथ ItemsSource की स्थापना = TwoWay कोई मतलब मेरे लिए बनाता है। आपका कम्बोबॉक्स कभी भी आपके व्यूमोडेल के लिए "एक नया आइटमसोर्स" नहीं बनाएगा।

संपादित करें: मुझे लगता है कि आपका पहला समाधान xaml में DataContext को सेट करने के कारण काम करता है। मुझे लगता है कि DataContext = "{बाध्यकारी सापेक्ष स्रोत = {सापेक्ष स्रोत स्वयं}, पथ =।}" InitializeComponent() को कॉल करते समय निष्पादित होता है; और क्योंकि आपकी लिस्टस्ट्रिंग प्रॉपर्टी सिर्फ एक ऑटोप्रोपर्टी है और इनोटिफ़ाईप्रॉपर्टी को लागू नहीं किया गया है - आपका मुख्यविंडोव्यूव अधिसूचित नहीं है कि आपका सीटीओआर एक नई लिस्टस्ट्रिंग प्रॉपर्टी बनाता है।

public ObservableCollection<string> ListString {get{return _list;}; set{_list=value; OnPropertyChanged("ListString");}} 

अपने दृष्टिकोण दोनों के साथ काम करना चाहिए, लेकिन आप अपने MainWindow वर्ग के लिए INotifyPropertyChanged को लागू करने की है।

+0

मुझे पता चला कि यह तब हो रहा है जब प्रारंभिक कॉम्पोनेंट कहा जाता है, यह उस विशेष ऑब्जेक्ट संदर्भ पर उस नियंत्रण को बांधता है और जब संदर्भ स्वयं बदल जाता है तो यह काम नहीं करता है। –

+0

यदि आप सूची सूची = नए OberservableCollection सेट करना चाहते हैं तो एक बार, आपको अपनी कक्षा के लिए INotifyPropertyChanged लागू करना होगा। InitializeComponent() के साथ समस्या; क्रमशः यह। डेटा कॉन्टेक्स्ट = यह; मेरे EDIT – blindmeis

+0

को देखें जिसने मेरी समस्या हल की है .. धन्यवाद बहुत सारे –

0

आप अपनी सूची के बाद कोड कोड में कंबोबॉक्स के लिए आइटम स्रोत सेट कर सकते हैं या फिर डेटाकॉन्टेक्स्ट सेट कर सकते हैं या आप संपत्ति परिवर्तन बढ़ाने के लिए इनोटिफाइंडेड के साथ जा सकते हैं।

public MainWindow() 
     { 
      InitializeComponent(); 
      InputString = ""; 
      ListString = new ObservableCollection<string>(); 
      ListString.Add("AAA"); 
      ListString.Add("BBB"); 
      ListString.Add("CCC"); 
      StringComboBox.ItemsSource = ListString; 

     } 
+0

आपके सुझावों के साथ यह भी काम नहीं करता है :( –

+0

आर आपको यकीन है कि आपने स्ट्रिंगकंबोबॉक्स.इटेम्ससोर्स = लिस्टस्ट्रिंग; अपने कोड में जोड़ा है। यह काम करना चाहिए। मैंने परीक्षण किया है मेरे अंत में और इसके काम पर। – Jason

+1

क्षमा करें यह काम कर रहा है लेकिन आपको नहीं लगता कि मुझे XAML के माध्यम से बाध्यकारी करना चाहिए –

0

काम करता है मुझे लगता है कि समस्या "नया हो रहा है" ListString। इसे एक संपत्ति बनाना (चयनित उत्तर) इसके चारों ओर एक रास्ता है। वैकल्पिक रूप से तत्काल को रेखांकित करना, या इसे InitializeComponent से पहले डालना मुझे विश्वास है कि ठीक रहेगा।

यदि नए होने की संभावना अक्सर होती है तो यह प्रबंधक वर्ग में ObservableCollection को समाहित करने में सहायक हो सकता है। मुझे इस तरह के सेटअप के साथ अपने स्वयं के मुद्दों की समस्या निवारण के बाद यह प्रश्न मिला। मुझे INotifyCollectionChanged लागू करने और इस तरह की घटना को

/// <summary> 
/// Maintains an observable (i.e. good for binding) collection of resources that can be indexed by name or alias 
/// </summary> 
/// <typeparam name="RT">Resource Type: the type of resource associated with this collection</typeparam> 
public class ResourceCollection<RT> : IEnumerable, INotifyCollectionChanged 
    where RT : class, IResource, new() 
{ 
    public event NotifyCollectionChangedEventHandler CollectionChanged 
    { 
     add { Ports.CollectionChanged += value; } 
     remove { Ports.CollectionChanged -= value; } 
    } 

    public IEnumerator GetEnumerator() { return Ports.GetEnumerator(); } 

    private ObservableCollection<RT> Ports { get; set; } 
    private Dictionary<string, RT> ByAlias { get; set; } 
    private Dictionary<string, RT> ByName { get; set; } 
} 
संबंधित मुद्दे