WPF切换DataGrid中的列可见性会触发意外事件

时间:2018-07-26 16:47:22

标签: c# wpf checkbox datagrid

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

这是我的设置:

  • 我有一个标签为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>

谢谢

1 个答案:

答案 0 :(得分:0)

在您的XAML中,将IsChecked的{​​{1}}属性绑定到名为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,这意味着,

  • 如果您的TwoWayIsChecked的{​​{1}}属性的值发生了变化,则该变化将反映在代码中的CheckBox属性中,< / li>

  • 如果代码中XAML属性的值发生变化,则该变化将反映在Import中实际的Import中。

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

我假设在Import的{​​{1}}中(您未在帖子中显示),您都更改了true的值。

因此,假设您要在用户选中/取消选中Click时想做某事,而不是btnChangeView,我想您要设置Import

阅读this,详细了解WPF中的绑定模式。