2012-05-23 43 views
2

我試圖將ComboBox綁定到ObservableCollection<MyType>,但它沒有像我期望的那樣工作。當我創建ComboData的實例時,例如如何在更改ComboBox的選定項目時觸發INotifyPropertyChanged處理程序?

ComboData = new ObservableCollection<MyType>(); 

並向其添加數據,例如,

ComboData.Add(new MyType(string.Format("{0}", i.ToString()), i)); 

我可以看到的MyTypeValue屬性被設置和PropertyChangedEventHandler事件處理程序。這是正確的功能。

問題是當我在以後的ComboBox中選擇不同的項目時。我期望看到Value被再次設置並觸發事件處理程序,但沒有任何反應。但是,我可以看到該屬性的吸氣劑正在被解僱並返回_value

有什麼我做錯了嗎?

MyType被定義爲:

public class MyType : INotifyPropertyChanged 
{ 
    public event PropertyChangedEventHandler PropertyChanged; 

    public MyType(string key, int value) 
    { 
     Key = key; 
     Value = value; 
    } 

    public string Key { get; set; } 
    private int _value; 
    public int Value 
    { 
     get { return _value; } 
     set 
     { 
      if (_value != value) 
      { 
       _value = value; 

       OnPropertyChanged("Value"); 
      } 
     } 
    } 

    internal void OnPropertyChanged(string prop) 
    { 
     if (PropertyChanged != null) 
     { 
      PropertyChanged(this, new PropertyChangedEventArgs(prop)); 
     } 
    } 

    private void IntegerItem_PropertyChanged(object sender, PropertyChangedEventArgs e) 
    { 
     // this never executes *after* the ComboBox has been populated!!! 
    } 

} 

用戶控件的XAML是:

<Grid> 
    <ComboBox x:Name="cboItems" 
     DisplayMemberPath="Key" 
     SelectedValuePath="Value" 
     ItemsSource="{Binding Path=ComboData}"> 
    </ComboBox> 
</Grid> 

背後的用戶代碼控制是

public partial class ComboBoxControl : UserControl 
{ 
    public ObservableCollection<MyType> ComboData { get; set; } 

    public ComboBoxControl() 
    { 
     InitializeComponent(); 

     ComboData = new ObservableCollection<MyType>(); 
     int min = 0; 
     int max = 10; 
     for (int i = min; i <= max; i++) 
     { 
      ComboData.Add(new MyType(string.Format("{0}", i.ToString()), i)); 
     } 

     cboItems.DataContext = this;    
    } 
} 

我需要做什麼來當我更改中的選定項目時,請啓動事件處理程序?

回答

0

CollectionViewMember.CurrentItem中選擇您的組合框中選擇不同的選項不會更改ComboData中的任何項目,它只是更改選定的項目,所以它不會在MyType中使用setter。它使用getter來檢索要顯示的值。

ComboBox有一個SelectedItemChanged事件,它將在選擇新項目時觸發。

0

最好使用CollectionView類,它有一個CurrentChanged事件。你可以綁定的CollectionView你的組合框。因此,當selecteditem更改..你可以從CurrentViewer.CurrentItem CurrentChangedEvent

相關問題