1

我想更改 DataGridCell 的内容。我在datagridview中有一个这样的列

<DataGridCheckBoxColumn CellStyle="ChangeContentOfCellSstyle"...

然后我有一个像这样的DataTrigger:

<Style TargetType="DataGridCell" x:Key="ChangeContentOfCellSstyle">
    <Style.Triggers>
        <DataTrigger Binding="{Binding IsWashed}" Value="True">
            <Setter Property="Content" Value="The new value for the cell."/> 
            <Setter Property="Background" Value="Red"/> //sets the background of the cell to red just to show the trigger is working
        </DataTrigger>
    </Style.Triggers>
</Style>

但是单元格的内容没有改变。甚至当我尝试对 DataGridTextColumn 进行相同操作时,尽管单元格变为红色。

4

3 回答 3

1

我已经删除了我之前的答案,因为使用模板选择器是一种更好的方法。

首先,我创建了一个 DataTemplateSelector 类,该类可用于基于绑定在 DataTemplates 之间切换,注意 2 个属性引用了将要应用的样式,我可以在这里使用 find 资源,但我认为这更干净并且不会不需要视图设计者坚持使用硬编码的模板键。

public class IsWashedStyleSelector : DataTemplateSelector
{

    public DataTemplate TrueStyle { get; set; }
    public DataTemplate FalseStyle { get; set; }

    public override DataTemplate SelectTemplate(object item, DependencyObject container)
    {
        TestClass targetItem = item as TestClass;
        if (targetItem != null)
        {
            return targetItem.IsWashed ? TrueStyle : FalseStyle;
        }
        return base.SelectTemplate(item, container);
    }
}

现在要使用这个模板选择器,我必须定义 2 个数据模板并在 xaml 资源中实例化选择器。

<DataTemplate x:Key="styleIsWashedTrue">
    <Button>It's true</Button>
</DataTemplate>
<DataTemplate x:Key="styleIsWashedFalse">
    <Label>is false</Label>
</DataTemplate>

<local:IsWashedStyleSelector x:Key="isWashedStyleSelector"  TrueStyle="{StaticResource styleIsWashedTrue}" FalseStyle="{StaticResource styleIsWashedFalse}"/>

最后,选择器可以像这样在 DataGridTemplateColumn 中使用。

<DataGrid ItemsSource="{Binding Items}" AutoGenerateColumns="False">
        <DataGrid.Columns>
            <DataGridCheckBoxColumn Binding="{Binding IsWashed}"/>
            <DataGridTextColumn Binding="{Binding Text}"/>
            <DataGridTemplateColumn CellTemplateSelector="{StaticResource isWashedStyleSelector}"/>
        </DataGrid.Columns>
    </DataGrid>
于 2012-11-20T14:29:14.460 回答
0

这个答案实际上是对@Andy 答案的评论。看来我无法在评论中格式化代码。

请注意,您可以DataTemplate在 XAML 中内联定义,将所有内容放在一个位置。

<local:IsWashedStyleSelector x:Key="isWashedStyleSelector">
  <local:IsWashedStyleSelector.TrueStyle>
    <DataTemplate>
      <Button>It's true</Button>
    </DataTemplate>
  </local:IsWashedStyleSelector.TrueStyle>
  <local:IsWashedStyleSelector.FalseStyle>
    <DataTemplate>
      <Label>is false</Label>
    </DataTemplate>
  </local:IsWashedStyleSelector.FalseStyle>
</local:IsWashedStyleSelector>

当然,这适用于您只想DataTemplate在一个地方使用这些定义的情况。

于 2017-03-06T14:37:18.687 回答
0

在我想根据绑定到行的属性更改单元格内容的情况下,上述方法不起作用。我想出了以下解决方案。

<DataGridTemplateColumn  >
<DataGridTemplateColumn.CellTemplate>
    <DataTemplate>
        <ContentPresenter   
                    Style="{StaticResource LockedStyle}" Content="{Binding}">
        </ContentPresenter>
    </DataTemplate>
</DataGridTemplateColumn.CellTemplate>

在资源字典中使用以下样式:

  <DataTemplate x:Key="LockedTemplate">
    <TextBlock FontFamily="Segoe MDL2 Assets" Text="&#xE72E;" ></TextBlock>
</DataTemplate>
<DataTemplate x:Key="UnLockedTemplate">
    <TextBlock FontFamily="Segoe MDL2 Assets" Text="&#xE785;"></TextBlock>
</DataTemplate>
<DataTemplate x:Key="NoneTemplate"></DataTemplate>
 <Style x:Key="LockedStyle" TargetType="ContentPresenter">
    <Setter Property="ContentTemplate" Value="{StaticResource NoneTemplate}"/>
    <Style.Triggers>
        <DataTrigger Binding="{Binding IsLocked}" Value="true">
            <Setter Property="ContentTemplate" Value="{StaticResource LockedTemplate}"/>
        </DataTrigger>
        <DataTrigger Binding="{Binding IsLocked}" Value="false">
            <Setter Property="ContentTemplate" Value="{StaticResource UnLockedTemplate}"/>
        </DataTrigger>
    </Style.Triggers>
</Style>
         
于 2021-06-13T10:19:32.107 回答