2

をにバインドしようとしてComboBoxいますObservableCollection<MyType>が、期待どおりに機能していません。のインスタンスを作成するとComboData、たとえば

ComboData = new ObservableCollection<MyType>();

それにデータを追加します。

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

ValueのプロパティMyTypeが設定され、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;            
    }
}

で選択したアイテムを変更したときにイベントハンドラーを起動するにはどうすればよいComboBoxですか?

4

2 に答える 2

0

CurrentChangedイベントを持つクラスを使用するCollectionViewことをお勧めします。CollectionViewをComboBoxにバインドできます。したがって、selecteditemが変更されると、CurrentChangedEventのCollectionViewMember.CurrentItemから値を取得できます。

于 2012-05-23T09:42:10.937 に答える
0

コンボボックスで別のオプションを選択しても、ComboDataのアイテムは変更されません。選択されたアイテムが変更されるだけなので、MyTypeのセッターは使用されません。ゲッターを使用して、表示する値を取得します。

ComboBoxにはSelectedItemChangedイベントがあり、新しいアイテムが選択されたときにトリガーされます。

于 2012-05-23T09:42:43.250 に答える