我想更改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尝试相同的操作,尽管单元格变为红色。
答案 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="" ></TextBlock>
</DataTemplate>
<DataTemplate x:Key="UnLockedTemplate">
<TextBlock FontFamily="Segoe MDL2 Assets" Text=""></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>