我有一个StatusCell
样式DataGridCell
我想在我的应用程序中的几个地方使用。我想将Style
标记外部化,以便我可以轻松地重复使用它,而无需在我的XAML中复制代码。
我发现的每个其他来源都要求我从我的ViewModel绑定属性的触发器。但是在整个应用程序中,该列可能绑定到MyStatusProperty
或SubObject.MyStatusProperty
等,所以我想这样做是为了让我有一个适用于所有这些的样式,而不必指定在哪里它来自。
我能够使用具有以下样式的TextBlock执行此操作。这让我可以将TextBlock
绑定到我想要的任何内容上,并且样式绑定在它来自哪里并不重要。
<Style x:Key="StatusLabel" TargetType="TextBlock">
<Style.Triggers>
<Trigger Property="Text" Value="Completed">
<Setter Property="Foreground" Value="Green"/>
</Trigger>
</Style.Triggers>
</Style>
当我创建一个我想要使用这个样式的文本块时,我所要做的就是
<TextBlock Style="{StaticResource StatusLabel}" Text="{Binding Whatever}" />
但是使用DataGridCell
它不允许我这样做
<Style x:Key="StatusCell" TargetType="DataGridCell">
<Style.Triggers>
<Trigger Property="Content" Value="Completed">
<Setter Property="Background" Value="Green"/>
<Setter Property="Foreground" Value="White" />
</Trigger>
</Style.Triggers>
</Style>
<DataGridTextColumn Header="Status" Binding="{Binding MyStatusProperty}"
CellStyle="{StaticResource StatusCell}" />
我也试过像这样设置触发器:
<DataTrigger Binding="{Binding Content, RelativeSource={RelativeSource Self}}" Value="Reviewed">
<Setter Property="Background" Value="Green"/>
<Setter Property="Foreground" Value="White" />
</DataTrigger>
但这些都不奏效。我也尝试过更换内容&#34;内容&#34;在最后一个例子中&#34; Binding&#34;和&#34;文字&#34;
我可以在DataGridCell
中绑定另一个属性,它可以将样式触发器绑定到单元格的内容而不知道绑定路径吗?
答案 0 :(得分:0)
像往常一样,我在询问后不久就找到了解决方法。由于它使用TextBlocks,我只需要使用TemplateColumns而不是TextColumns,尽管我仍然希望能够使用TextColumns,因为他们使用的是少了6行XAML。
<DataGridTemplateColumn Header="Status">
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<TextBlock Text="{Binding MyProperty}" Style="{StaticResource StatusCellTextBlock}" />
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
使用样式:
<Style x:Key="StatusCellTextBlock" TargetType="TextBlock">
<Style.Triggers>
<Trigger Property="Text" Value="Completed">
<Setter Property="Background" Value="Green"/>
<Setter Property="Foreground" Value="White" />
</Trigger>
</Style.Triggers>
</Style>