簡體   English   中英

更改ComboBox的選定項時如何觸發INotifyPropertyChanged處理程序?

[英]How to fire INotifyPropertyChanged handler when I change ComboBox's selected item?

我正在嘗試將ComboBox綁定到ObservableCollection<MyType>但是它沒有按我期望的那樣工作。 當我創建一個ComboData實例時,例如

ComboData = new ObservableCollection<MyType>();

並向其中添加數據,例如

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

我可以看到正在設置MyTypeValue屬性,並且執行了PropertyChangedEventHandler事件處理程序。 這是正確的功能。

問題是稍后我在ComboBox框中選擇其他項目時。 我希望看到Value再次被設置並觸發事件處理程序,但是什么也沒有發生。 但是,我可以看到該屬性的getter正在被觸發並返回_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;            
    }
}

更改ComboBox的選定項目時,我需要怎么做才能觸發事件處理程序?

最好使用具有CurrentChanged事件的CollectionView類。您可以將CollectionView綁定到ComboBox。 因此,當selecteditem更改時..您可以從CurrentChangedEvent中的CollectionViewMember.CurrentItem獲取值

在組合框中選擇其他選項不會更改ComboData中的任何項目,而只是更改所選項目,因此不會使用MyType中的setter。 它使用getter檢索要顯示的值。

ComboBox具有SelectedItemChanged事件,該事件將在選擇新項目時觸發。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM