【问题标题】:Bind DataGridCell style directly to its contents将 DataGridCell 样式直接绑定到其内容
【发布时间】:2014-04-03 02:37:31
【问题描述】:

我有一个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>

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

我可以在DataGridCell 中绑定另一个属性,它可以让样式触发器在不知道绑定路径的情况下绑定到单元格的内容?

【问题讨论】:

    标签: wpf xaml


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-03-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多