WPF DataGridComboBoxColum - 选择值时触发

WPF DataGridComboBoxColum - trigger on selecting value

我有一个包含多个字段的 DataGrid,其中之一是 DataGridComboBoxColumn。在那一个上,我默认根据一个字段“添加项目”动态添加项目。如果我添加了 Item 1 并且当前处于选中状态,我希望当用户单击下拉菜单并再次选择 Item 1 时,我可以触发我的源并编辑该项目。但是目前使用 UpdateSourceTrigger=PropertyChanged 不会触发任何更改。

看起来 UpdateSourceTrigger=Explicit 是我需要的,但我不确定如何实现 UpdateSource() 方法来执行我想要的操作。

我的 xaml 片段

            <DataGridComboBoxColumn x:Name="ItemColumn" Header="{x:Static res:RES.HEADER}"
                                    ToolTipService.ToolTip="{x:Static res:RES.TOOLTIP}"
                                    SelectedValueBinding="{Binding Path=Item, UpdateSourceTrigger=PropertyChanged, NotifyOnValidationError=True}" >
                <DataGridComboBoxColumn.ElementStyle>
                    <Style TargetType="ComboBox" BasedOn="{StaticResource DataGridComboBoxElementStyle}">
                        <Setter Property="ItemsSource" Value="{Binding Items, UpdateSourceTrigger=PropertyChanged}" />
                    </Style>
                </DataGridComboBoxColumn.ElementStyle>
                <DataGridComboBoxColumn.EditingElementStyle>
                    <Style TargetType="ComboBox" BasedOn="{StaticResource DataGridComboBoxEditingElementStyle}">
                        <Setter Property="ItemsSource" Value="{Binding Items, UpdateSourceTrigger=PropertyChanged}" />
                    </Style>
                </DataGridComboBoxColumn.EditingElementStyle>
            </DataGridComboBoxColumn>

我得到了 string Item 和一个 List<string> Items 属性来绑定字段。

是否有可能获得一个示例,说明如何在用户每次单击项目的下拉列表时使用 Explicit 获取触发器,即使已经被选中?还是有其他不使用 Explicit 的方法?我尽可能多地使用 MVVM,所以这也是一个要考虑的因素。

SelectedValueBinding 源 属性 仅在您 select 一个 值时设置。

如果你想在当前 selected 值再次被 selected 时做一些事情,你可以在视图中处理这个,例如处理 DropDownOpenedDropDownClosed 事件:

private void ComboBox_Loaded(object sender, RoutedEventArgs e)
{
    ComboBox cmb = (ComboBox)sender;
    cmb.DropDownOpened += Cmb_DropDownOpened;
    cmb.DropDownClosed += Cmb_DropDownClosed;
}

string _selectedValue;
private void Cmb_DropDownOpened(object sender, EventArgs e)
{
    _selectedValue = ((ComboBox)sender).SelectedItem as string;
}

private void Cmb_DropDownClosed(object sender, EventArgs e)
{
    string selectedValue = ((ComboBox)sender).SelectedItem as string;
    if (selectedValue == _selectedValue)
    {
        //same value was selected...
    }
}

XAML:

<DataGridComboBoxColumn.EditingElementStyle>
    <Style TargetType="ComboBox">
        <Setter Property="ItemsSource" Value="{Binding Items, UpdateSourceTrigger=PropertyChanged}" />
        <EventSetter Event="Loaded" Handler="ComboBox_Loaded" />
    </Style>
</DataGridComboBoxColumn.EditingElementStyle>