如何将样式绑定到具有样式元素的任何datacontext的属性?

时间:2012-02-20 10:16:10

标签: wpf binding datagrid datacontext

我在样式触发器中有一个数据触发器,如下所示

<Style TargetType="DataGridCell" x:Key="ChangeAnimation" >
    <Style.Triggers>
        <DataTrigger Binding="{Binding Path=APropertyOfTheDataGridCellContext Bind DataContext}" Value="True" >
            ...
        </DataTrigger>
    </Style.Triggers>
</Style>

我将使用属性CellStyle将此样式应用于某些DataGridColumns。我想要的是将样式的DataTrigger绑定到单元格的datacontext的属性,这样我就可以在所有必需的列上使用此样式,而不必为每列创建新样式。这可能吗?

提前致谢。

编辑:为了澄清,DataGrid的DataContext是一个ViewModel,它具有一个名为Rows的属性,而Rows有一个名为Cells的属性,其属性名为Blink。我想在样式中引用属性,如下所示:

<DataGrid.Resources>
<Style TargetType="DataGridCell" x:Key="ChangeAnimation" >
    <Style.Triggers>
        <DataTrigger Binding="{Binding Path=Blink}" Value="True" >
            ...
        </DataTrigger>
    </Style.Triggers>
</Style>
</DataGrid.Resources>

这给了我一个错误,因为DataGridResources的datacontext是包含Rows而不是单元格的那个。如何从样式中引用DataGridCell DataContext?

1 个答案:

答案 0 :(得分:5)

删除x:Key属性,然后将其应用于所有列。

<Style TargetType="{x:Type DataGridCell}"> 
    <Style.Triggers>         
        <DataTrigger Binding="{Binding Path=DataContext.MyProperty,RelativeSource={RelativeSource Mode=FindAncestor,AncestorType={x:Type DataGridCell}}}" Value="True" />                       
   </Style.Triggers>
</Style>

如果您有2个DataGrids,那么您应该将此样式保留在要修改的dataGrid的Resources标记中...

如果RelativeSource不工作,我宁愿通过触发器更改列的模板以实现类似的行为

为列写入触发器

<WpfToolkit:DataGridTemplateColumn MinWidth="50"
                                   MaxWidth="80"
                                   Header="MyHeader"
                                   IsReadOnly="True">
    <WpfToolkit:DataGridTemplateColumn.CellTemplate>
        <DataTemplate>
            <DataTemplate.Resources>
                <DataTemplate x:Key="normalTemplate" />
                <DataTemplate x:Key="ChangeTempalte">
                   <!-Your Controls->
                </DataTemplate>
            </DataTemplate.Resources>
            <ContentPresenter x:Name="chnagedField"
                              Content="{Binding}"
                              ContentTemplate="{StaticResource ResourceKey=normalTemplate}" />
            <DataTemplate.Triggers>
                <DataTrigger Binding="{Binding Path=MyProperty}" Value="True">
                    <Setter TargetName="EditableField" Property="ContentTemplate" Value="{StaticResource ResourceKey=chnageTempalte}" />
                </DataTrigger>
            </DataTemplate.Triggers>
        </DataTemplate>
    </WpfToolkit:DataGridTemplateColumn.CellTemplate>
</WpfToolkit:DataGridTemplateColumn>  

此处MyPropertyDataContext DataGridRow的属性,因此您可以选择任何级别的嵌套属性yo比较该特定行...唯一不足的是您必须为需要此

的所有列执行此操作

我希望它有所帮助