WPF DataGridTemplateColumn - CheckBox IsChecked 触发器 属性
WPF DataGridTemplateColumn - Trigger for CheckBox IsChecked Property
我正在创建一个带有 DataGridTemplateColumn
CheckBox 的 WPF DataGrid
控件,它应该将 IsChecked 属性 设置为 true 或 false 取决于 DataTable
值)...
如果 DataTable
行的值设置为 1,则 DataGridTemplateColumn
应该是 true(检查)。否则,它将是 false(未选中)...默认情况下,每个新行都将设置为 true,但我无法绑定这些 CheckBox
行到我的 DataTable
值(将是 1 或 2)
我尝试了以下 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 和相关的东西。但是,那部分是您的,您需要对此进行更多研究。我觉得这个问题到此为止就足够了。
我正在创建一个带有 DataGridTemplateColumn
CheckBox 的 WPF DataGrid
控件,它应该将 IsChecked 属性 设置为 true 或 false 取决于 DataTable
值)...
如果 DataTable
行的值设置为 1,则 DataGridTemplateColumn
应该是 true(检查)。否则,它将是 false(未选中)...默认情况下,每个新行都将设置为 true,但我无法绑定这些 CheckBox
行到我的 DataTable
值(将是 1 或 2)
我尝试了以下 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 和相关的东西。但是,那部分是您的,您需要对此进行更多研究。我觉得这个问题到此为止就足够了。