组合框.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;
    }
}

组合框.SourceUpdated事件未被触发

经过一个小时的努力,我终于想出了办法。答案是基于这个问题:倾听依赖属性的变化。

所以基本上你可以为对象上的任何DependencyProperty定义一个"Property Changed"事件。当您需要扩展或向控件添加其他事件而无需创建新类型时,这非常有用。基本过程如下:

DependencyPropertyDescriptor descriptor = 
   DependencyPropertyDescriptor.FromProperty(ComboBox.ItemsSourceProperty, typeof(ComboBox));
descriptor.AddValueChanged(myComboBox, (sender, e) => 
{ 
   myComboBox.SelectedIndex = 0;
});

它的作用是为ComboBox.ItemsSource属性创建一个DependencyPropertyDescriptor对象,然后您可以使用该描述符为该类型的任何控件注册一个事件。在本例中,每次更改myComboBoxItemsSource属性时,SelectedIndex属性被设置回0(表示选择列表中的第一项)