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

时间:2014-04-02 18:26:41

标签: wpf xaml

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

我发现的每个其他来源都要求我从我的ViewModel绑定属性的触发器。但是在整个应用程序中,该列可能绑定到MyStatusPropertySubObject.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中绑定另一个属性,它可以将样式触发器绑定到单元格的内容而不知道绑定路径吗?

1 个答案:

答案 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>