我正在尝试将ComboBox
绑定到ObservableCollection<MyType>
,但它没有像我预期的那样工作。当我创建ComboData
的实例时,例如
ComboData = new ObservableCollection<MyType>();
并向其添加数据,例如
ComboData.Add(new MyType(string.Format("{0}", i.ToString()), i));
我可以看到Value
的{{1}}属性正在设置,MyType
事件处理程序正在执行。这是正确的功能。
问题是当我稍后在PropertyChangedEventHandler
中选择其他项目时。我希望再次设置ComboBox
并触发事件处理程序,但没有任何反应。但是,我可以看到该属性的getter被触发并返回Value
。
我有什么问题吗?
_value
定义为:
MyType
用户控件的XAML是:
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!!!
}
}
用户控件背后的代码是
<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 :(得分:0)
最好使用具有CurrentChanged事件的CollectionView
类。您可以将CollectionView绑定到ComboBox。因此,当selectitem更改时...您可以从CurrentChangedEvent中的CollectionViewMember.CurrentItem获取值
答案 1 :(得分:0)
在组合框中选择其他选项不会更改ComboData中的任何项目,它只是更改所选项目,因此它不会使用MyType中的setter。它使用getter来检索要显示的值。
ComboBox有一个SelectedItemChanged事件,该事件将在选择新项目时触发。