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 时做一些事情,你可以在视图中处理这个,例如处理 DropDownOpened
和 DropDownClosed
事件:
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>
我有一个包含多个字段的 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 时做一些事情,你可以在视图中处理这个,例如处理 DropDownOpened
和 DropDownClosed
事件:
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>