在datatrigger上更改datagridcell中的内容

时间:2012-11-20 13:16:34

标签: c# wpf binding datatrigger datagridcell

我想更改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尝试相同的操作,尽管单元格变为红色。

3 个答案:

答案 0 :(得分: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>

答案 1 :(得分:0)

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

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

<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定义的时间。

答案 2 :(得分: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>