首页 文章

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

提问于
浏览
1

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

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

  • 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>
    

    这里 MyPropertyDataGridRowDataContext 的属性,因此您可以选择任何级别的嵌套属性yo比较该特定行...唯一的缺点是您必须对需要此项的所有列执行此操作

    我希望它有所帮助

相关问题