WPF DataGridTemplateColumn - CheckBox IsChecked 触发器 属性

WPF DataGridTemplateColumn - Trigger for CheckBox IsChecked Property

我正在创建一个带有 DataGridTemplateColumn CheckBox 的 WPF DataGrid 控件,它应该将 IsChecked 属性 设置为 truefalse 取决于 DataTable 值)...

如果 DataTable 行的值设置为 1,则 DataGridTemplateColumn 应该是 true(检查)。否则,它将是 false(未选中)...默认情况下,每个新行都将设置为 true,但我无法绑定这些 CheckBox 行到我的 DataTable 值(将是 12

我尝试了以下 C# 代码。当我完成 UserControl 版本并循环遍历我的 DataTable 以保存其值时它会起作用......但是,当我设置 gridResultados.ItemsSource = dataTable.DefaultView显然不是 checking/unchecking 我的 CheckBoxes 因为 DataTable 列值(1 或 2)和我的 DataGridTemplateColumn 之间没有绑定......这是我最接近的方法:

<DataGrid>
<DataGrid.Columns>
<DataGridTemplateColumn Header="Value?" >
    <DataGridTemplateColumn.CellTemplate>
        <DataTemplate>
            <CheckBox IsChecked="True" Checked="CheckBox_Checked" Unchecked="CheckBox_Unchecked">
                <Style TargetType="{x:Type CheckBox}">
                    <Style.Triggers>
                        <Trigger Property="Content" Value="1">
                            <Setter Property="IsChecked" Value="True"/>
                        </Trigger>
                        <Trigger Property="Content" Value="2">
                            <Setter Property="IsChecked" Value="False"/>
                        </Trigger>
                    </Style.Triggers>
                </Style>
            </CheckBox>
        </DataTemplate>
    </DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
</DataGrid.Columns>
</DataGrid>
private void CheckBox_Checked(object sender, RoutedEventArgs e)
{
    dataTable.Rows[gridResultados.SelectedIndex].SetField(4, 1);
}

private void CheckBox_Unchecked(object sender, RoutedEventArgs e)
{
    dataTable.Rows[gridResultados.SelectedIndex].SetField(4, 2);
}

首先我建议你不要在 WPF 中使用 DataTable,因为我们通常在 WPF 中使用 EF,DataTable 是 ADO.NET 的一部分,它已经过时并且几乎被弃用了。

对于您的问题,您需要解决一些涉及绑定和触发器的问题。首先,此处每一行中的隐式 DataContext 是一个 DataRowView。它仅供 DataTrigger 使用(不适用于 Trigger)。所以你需要使用 DataTrigger 而不是监听索引 [4] (它引用第五列 - CheckBox 的列)。其次,您设置的 Style 是错误的,它应该包含在 CheckBox.Style 中,以使其理解您为 CheckBox 而不是为其 Content 设置了样式。第三,Style 触发器无法覆盖本地设置 IsChecked(如在您的代码中),在这种情况下,模板触发器可以覆盖它,但您也可以使用样式 Setter 来设置默认值True 对于 IsChecked。 这是您应该拥有的代码:

<DataGridTemplateColumn Header="Value?">
  <DataGridTemplateColumn.CellTemplate>
    <DataTemplate>
        <CheckBox Checked="CheckBox_Checked" Unchecked="CheckBox_Unchecked">
            <CheckBox.Style>
               <Style TargetType="{x:Type CheckBox}">
                  <Setter Property="IsChecked" Value="True"/>
                  <Style.Triggers>
                    <DataTrigger Binding="{Binding [4]}" Value="1">
                        <Setter Property="IsChecked" Value="True"/>
                    </DataTrigger>
                    <DataTrigger Binding="{Binding [4]}" Value="2">
                        <Setter Property="IsChecked" Value="False"/>
                    </DataTrigger>
                  </Style.Triggers>
              </Style>
            <CheckBox.Style>
        </CheckBox>
    </DataTemplate>
  </DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>

顺便说一句,我可以看到您使用事件处理程序来更新基础数据的值。但就 MVVM 而言,这不是正确的方法,因为几乎您需要的是 Binding 和相关的东西。但是,那部分是您的,您需要对此进行更多研究。我觉得这个问题到此为止就足够了。