将 DataGridCell 样式直接绑定到其内容



我有一个StatusCellDataGridCell样式,我想在我的应用程序中的几个地方使用。我想外部化 Style 标记,以便我可以轻松地重用它,而无需在任何地方复制 XAML 中的代码。

我找到的所有其他源都要求我将触发器从我的 ViewModel 中绑定到属性之外。但是在整个应用程序中,该列可能绑定到 MyStatusPropertySubObject.MyStatusProperty 等,因此我想这样做是为了允许我拥有一种适用于所有这些的样式,而无需指定它从何处绑定。

我能够使用以下样式的文本块来做到这一点。这使我可以将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>

但这些都不起作用。我还尝试将上一个示例中的"内容"换成"绑定"和"文本"

是否可以在DataGridCell中绑定到另一个属性,该属性将允许在不知道绑定路径的情况下将样式触发器绑定到单元格的内容?

像往常一样,我在询问后不久就找到了解决方法。由于它与 TextBlock 一起使用,我只需要使用 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>

最新更新