2

我有两个组合框。它们都绑定到ObservableCollectionsViewModel 中的两个不同的项,当 ComboBox1 中的选定项发生更改时,ComboBox2 将使用不同的集合进行更新。绑定工作得很好,但是,我希望第二个 ComboBox 始终选择其集合中的第一个项目。最初,它可以工作,但是,当 ComboBox2 中的源和项目更新时,选择索引更改为 -1(即不再选择第一个项目)。

为了解决这个问题,我SourceUpdated向 ComboBox2 添加了一个事件,该事件调用的方法将索引更改回 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;
    }
}

任何帮助表示赞赏。

4

1 回答 1

4

经过一个小时的努力,我终于弄明白了。答案基于这个问题:Listen to changes of dependency property。

所以基本上你可以为对象上的任何对象定义一个“属性更改”事件DependencyProperty。当您需要在控件中扩展或添加其他事件而无需创建新类型时,这将非常有用。基本程序是这样的:

DependencyPropertyDescriptor descriptor = 
   DependencyPropertyDescriptor.FromProperty(ComboBox.ItemsSourceProperty, typeof(ComboBox));

descriptor.AddValueChanged(myComboBox, (sender, e) => 
{ 
   myComboBox.SelectedIndex = 0;
});

它的作用是DependencyPropertyDescriptor为属性创建一个对象ComboBox.ItemsSource,然后您可以使用该描述符为该类型的任何控件注册一个事件。在这种情况下,每次更改 的ItemsSource属性时,都会将该属性设置回 0(这意味着选择了列表中的第一项。)myComboBoxSelectedIndex

于 2013-05-09T20:39:02.480 回答