首页 > 解决方案 > DataGrid 中的 WPF 切换列可见性触发不需要的事件

问题描述

我有一个奇怪的问题,即通过按一下按钮来更改数据网格列的可见性,它会触发与该数据网格列中的复选框相关联的“已检查”事件。

所以这是我的设置:

但是,如果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>

谢谢

标签: c#wpfcheckboxdatagrid

解决方案


在您的中,您将您的属性XAML绑定到一个名为.IsCheckedCheckBoxImport

<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属性值发生变化,该变化将反映在代码中的属性中,CheckBoxXAMLImport

和,

  • 如果Import代码中的属性值发生变化,该变化将反映CheckBoxXAML.

换句话说,如果用户选中复选框,Import则 value 将设置为true。如果用户取消选中该复选框,Import将是false. 相反,如果您在代码中的任何位置更改Importto的值false,您的 GUI 复选框将被取消选中。如果在代码Import中设置为true,GUI 复选框将被选中。

我假设Click即使在btnChangeView(您的帖子中没有显示),您也会更改Import.

因此,Mode=TwoWay假设您想在用户选中/取消选中 时做某事,而不是CheckBox,我认为您想要设置Mode=OneWayToSource.

阅读内容以获取 WPF 中绑定模式的详细说明。


推荐阅读