【问题标题】:WPF switching column visibility in DataGrid triggers unwanted eventDataGrid 中的 WPF 切换列可见性触发不需要的事件
【发布时间】:2019-01-03 17:54:13
【问题描述】:

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

这是我的设置:

  • 我有一个标签 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。以及背后的 btnChangeView 代码
  • XAML 中的复选框触发器关联可能存在问题。是的,请张贴XAML 和后面的按钮代码。
  • 我为复选框之一添加了 XAML。按钮后面的代码非常简单:grid.Columns[0].Visibility = Visibility.Visible; grid.Columns[1].Visibility = Visibility.Collapsed; grid.Columns[2].Visibility = Visibility.Collapsed; grid.Columns[3].Visibility = Visibility.Visible;
  • @Sach,您可以帮我解决这个问题吗?谢谢。
  • 后面代码中的Import 属性是什么?你在哪里更改代码中的值?

标签: c# wpf checkbox datagrid


【解决方案1】:

在您的XAML 中,您将CheckBoxIsChecked 属性绑定到一个名为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,这意味着,

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

和,

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

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

我假设在 Click 甚至 btnChangeView(您的帖子中没有显示)中,您更改了 Import 的值。

所以,不是Mode=TwoWay,假设你想在用户选中/取消选中CheckBox时做某事,我想你想设置Mode=OneWayToSource

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

【讨论】:

    猜你喜欢
    • 2018-07-28
    • 1970-01-01
    • 2010-11-16
    • 2014-10-03
    • 1970-01-01
    • 2011-09-10
    • 1970-01-01
    • 2011-04-28
    • 1970-01-01
    相关资源
    最近更新 更多