gpt4 book ai didi

c# - 使用 xaml 在数据网格中选择行后更改 DataGridTemplateColumn 中的复选框状态

转载 作者:行者123 更新时间:2023-11-30 16:41:39 24 4
gpt4 key购买 nike

我正在创建一个 wpf 应用程序并在一段时间内努力解决这个问题。我有一个带有 DataGridTemplateColumn 的数据网格,其中包含一个复选框和文本 block 。

  <DataGrid
Name="ChargeDataGrid"
Grid.Row="1"
AutoGenerateColumns="False">
<DataGrid.Columns>
<DataGridTemplateColumn Width="*">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal">
<CheckBox x:Name="CheckBox1"/>
<TextBlock Text="{Binding}" />
</StackPanel>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
<DataGridTemplateColumn.HeaderTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal">
<CheckBox />
<TextBlock Text="Title" />
</StackPanel>
</DataTemplate>
</DataGridTemplateColumn.HeaderTemplate>
</DataGridTemplateColumn>
</DataGrid.Columns>
<system:String>123</system:String>
<system:String>124</system:String>
<system:String>125</system:String>
<system:String>126</system:String>
<system:String>127</system:String>
</DataGrid>

我需要实现的是,当单击该行时,该行中的复选框也必须处于选中状态。我尝试使用样式触发器:

<Style TargetType="{x:Type DataGridCell}">
<Style.Triggers>
<Trigger Property="IsSelected" Value="True">
<Setter Property="CheckBox1.IsChecked" Value="True" />
<Setter Property="Background" Value="Blue" />
</Trigger>
</Style.Triggers>
</Style>

但似乎不可能像这样更改复选框状态。我知道如何以代码隐藏或 mvvm 样式进行操作,但在这种情况下,我想知道是否可以仅使用 xaml?

如有任何帮助,我们将不胜感激。

最佳答案

恐怕使用普通的标准 XAML 是做不到的。正如我所见,您有两个选择:

  1. 您可以使用一些扩展库来扩展绑定(bind)的功能。一些功能可以在 mvvm 框架中找到,例如 MugenMvvmToolkit
  2. 第二种选择是为此目的使用一些转换器。

我对第二种变体的解决方案是一种 hack,在我看来,更优雅的方法是使用代码隐藏。转换器:

public class MultiValueConverter : IMultiValueConverter
{
public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture)
{
if (values.Length != 3) throw new ArgumentException("Should be 3 params");
if (!(values[2] is FrameworkElement element)) return values[1];

if (!(bool)values[0])
{
element.Tag = "Value need to be changed.";
return values[1];
}

if (element.Tag.Equals("Value changed.")) return values[1];
var res = !(bool)(values[1] ?? true);
element.Tag = "Value changed.";
return res;
}

public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}

转换器反转 bool 变量并将先前的状态保存在控件的 Tag 属性中。这仍然不是代码隐藏和相当可重用的解决方案。您可以在需要此类行为的任何其他 View 中使用此类转换器

在 XAML 中,我只更改了复选框控件定义:

<CheckBox x:Name="RowCheckBox" IsHitTestVisible="False">
<CheckBox.IsChecked>
<MultiBinding Converter="{StaticResource MultiValueConverter}" Mode="OneWay">
<Binding Path="IsSelected" RelativeSource="{RelativeSource FindAncestor, AncestorType={x:Type DataGridRow}}" />
<Binding Path="IsChecked" RelativeSource="{RelativeSource Self}" />
<Binding Mode="OneWay" RelativeSource="{RelativeSource Self}" />
</MultiBinding>
</CheckBox.IsChecked>
</CheckBox>

关于c# - 使用 xaml 在数据网格中选择行后更改 DataGridTemplateColumn 中的复选框状态,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48298873/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com