c# - DataGrid 中的 WPF 切换列可见性触发不需要的事件
问题描述
我有一个奇怪的问题,即通过按一下按钮来更改数据网格列的可见性,它会触发与该数据网格列中的复选框相关联的“已检查”事件。
所以这是我的设置:
我有一个
lblUpdateMode
带有“单行”或“每一行”文本的标签;一个有 10 列的数据网格,最初 5 列是可见的,5 列是隐藏的;
按下按钮
btnChangeView
会翻转每列的可见性;在其中一个数据网格列中,我有一个 CheckBoxColumn,带有 Checked/Unchecked 事件。
text = "every row"
如果按单个复选框的标签会更新每一行。
但是,如果label = "every row"
我按下btnChangeView
,它还会触发 Checked 事件并更新每一行中的复选框。
为什么会发生这种情况,我该如何避免?
这是 Checked 事件的代码 - 没什么花哨或奇怪的:
private void UpdateDataGridCheckBox(string colname, bool v)
{
if (lblUpdateMode.Content.ToString() == "Every Row")
{
foreach (DataRow dr in DataAccess.Instance.sourceFiles.Rows)
{
dr[colname] = v;
}
}
}
这是此列的 XAML:
<DataGrid x:Name="dataGridFiles" Grid.Row="2" Margin="10" Visibility="Collapsed"
ItemsSource="{Binding Path=DataAccess.Instance.sourceFiles, Mode=TwoWay}">
<DataGrid.Columns>
<!--Import-->
<DataGridTemplateColumn Header="Import" Width="60" CanUserReorder="True" Visibility="Collapsed">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<CheckBox x:Name="checkBoxImport" HorizontalAlignment="Center" VerticalAlignment="Center"
IsChecked="{Binding Path=Import, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
Checked="checkBoxImport_Checked"
Unchecked="checkBoxImport_Unchecked"></CheckBox>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
</DataGrid.Columns>
谢谢
解决方案
在您的中,您将您的属性XAML
绑定到一个名为.IsChecked
CheckBox
Import
<CheckBox x:Name="checkBoxImport" HorizontalAlignment="Center" VerticalAlignment="Center"
IsChecked="{Binding Path=Import, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}"
Checked="checkBoxImport_Checked"
Unchecked="checkBoxImport_Unchecked"></CheckBox>
但是,绑定Mode
设置为TwoWay
,这意味着,
- 如果your中的
IsChecked
属性值发生变化,该变化将反映在代码中的属性中,CheckBox
XAML
Import
和,
- 如果
Import
代码中的属性值发生变化,该变化将反映CheckBox
在XAML
.
换句话说,如果用户选中复选框,Import
则 value 将设置为true
。如果用户取消选中该复选框,Import
将是false
. 相反,如果您在代码中的任何位置更改Import
to的值false
,您的 GUI 复选框将被取消选中。如果在代码Import
中设置为true
,GUI 复选框将被选中。
我假设Click
即使在btnChangeView
(您的帖子中没有显示),您也会更改Import
.
因此,Mode=TwoWay
假设您想在用户选中/取消选中 时做某事,而不是CheckBox
,我认为您想要设置Mode=OneWayToSource
.
阅读此内容以获取 WPF 中绑定模式的详细说明。