组合框.SourceUpdated事件未被触发
本文关键字:事件 SourceUpdated 组合 | 更新日期: 2023-09-27 18:13:06
我的视图中有两个combobox。它们都在ViewModel中绑定到两个不同的ObservableCollections
,当ComboBox1中选择的项被更改时,ComboBox2将使用不同的集合更新。绑定工作得很好,但是,我希望第二个ComboBox总是选择其集合中的第一个项目。最初,它可以工作,但是,当ComboBox2中的源和项被更新时,选择索引被更改为-1(即第一个项不再被选中)。
为了解决这个问题,我向ComboBox2添加了一个SourceUpdated
事件,该事件调用的方法将索引更改回0。问题是该方法永远不会被调用(我在方法的最顶部放置了一个断点,它不会被击中)。下面是我的XAML代码:
<Grid>
<StackPanel DataContext="{StaticResource mainModel}" Orientation="Vertical">
<ComboBox ItemsSource="{Binding Path=FieldList}" DisplayMemberPath="FieldName"
IsSynchronizedWithCurrentItem="True"/>
<ComboBox Name="cmbSelector" Margin="0,10,0,0"
ItemsSource="{Binding Path=CurrentSelectorList, NotifyOnSourceUpdated=True}"
SourceUpdated="cmbSelector_SourceUpdated">
</ComboBox>
</StackPanel>
</Grid>
在代码后面:
// This never gets called
private void cmbSelector_SourceUpdated(object sender, DataTransferEventArgs e)
{
if (cmbSelector.HasItems)
{
cmbSelector.SelectedIndex = 0;
}
}
经过一个小时的努力,我终于想出了办法。答案是基于这个问题:倾听依赖属性的变化。
所以基本上你可以为对象上的任何DependencyProperty
定义一个"Property Changed"事件。当您需要扩展或向控件添加其他事件而无需创建新类型时,这非常有用。基本过程如下:
DependencyPropertyDescriptor descriptor =
DependencyPropertyDescriptor.FromProperty(ComboBox.ItemsSourceProperty, typeof(ComboBox));
descriptor.AddValueChanged(myComboBox, (sender, e) =>
{
myComboBox.SelectedIndex = 0;
});
它的作用是为ComboBox.ItemsSource
属性创建一个DependencyPropertyDescriptor
对象,然后您可以使用该描述符为该类型的任何控件注册一个事件。在本例中,每次更改myComboBox
的ItemsSource
属性时,SelectedIndex
属性被设置回0(表示选择列表中的第一项)