【问题标题】:DataGridCell style based on DataGrid property基于 DataGrid 属性的 DataGridCell 样式
【发布时间】:2017-10-16 23:03:43
【问题描述】:

我想为自定义DataGridDataGridCell 添加一个样式,该样式基于该DataGrid 的属性。例如,我想要一个名为 VisualizeReadOnlyCells 的 DependencyProperty,如果该属性设置为 True,我希望使用灰色背景绘制 ReadOnly 的 DataGridCell。和其他类似的事情。作为一种解决方法,我为DataGridCell 创建了两种不同的样式,并将这些样式分配给DataGrid 样式定义中DataGridCellStyle 属性。但是随着属性的增加,此类样式的数量将会增加,并且代码将非常难以管理。

我目前的解决方案是:

<Style x:Key="DataGridCellNoVisualize" TargetType="DataGridCell">
    - style definition
</Style>

<Style x:Key="DataGridCellVisualize" TargetType="DataGridCell">
    <Style.Triggers>
        <Trigger Property="IsReadOnly" Value="True">
            <Setter Property="Background" Value="Gray"/>
        </Trigger>
    </Style.Triggers>
</Style>

<Style x:Key="DataGridStyle" TargetType="MyCustomDataGrid">
    <Setter Property="CellStyle" Value="{StaticResource DataGridCellNoVisualize"/>
    <Style.Triggers>
        <Trigger Property="VisualizeReadOnlyCells" Value="True">
            <Setter Property="CellStyle" Value="{Static Resource DataGridCellVisualize"/>
        </Trigger>
    </Style.Triggers>
</Style>

我想得到的是这样的:

<Style x:Key="DataGridCellUniversalStyle" TargetType="DataGridCell">
    - style definition
    <Style.Triggers>
        <MultiTrigger>
            <MultiTrigger.Conditions>
                <Condition Property="IsReadOnly" Value="True"/>
                <Condition Property="MyParentDataGrid.VisualizeReadOnlyCells" Value="True"/>
            </MultiTrigger.Conditions>
            <MultiTrigger.Setters>
                <Setter Property="Background" Value="Gray"/>
            </MultiTrigger.Setters>
        </MultiTrigger>
    </Style.Triggers>
</Style>

【问题讨论】:

    标签: c# wpf xaml datagrid


    【解决方案1】:

    如果我正确理解您的问题,您可以使用MultiDataTrigger 并绑定到DataGridCell 和父DataGrid

    <Style x:Key="DataGridCellUniversalStyle" TargetType="DataGridCell">
        <Style.Triggers>
            <MultiDataTrigger>
                <MultiDataTrigger.Conditions>
                    <Condition Binding="{Binding IsReadOnly, RelativeSource={RelativeSource Self}}" Value="True"/>
                    <Condition Binding="{Binding VisualizeReadOnlyCells, RelativeSource={RelativeSource AncestorType=local:MyCustomDataGrid}}" Value="True"/>
                </MultiDataTrigger.Conditions>
                <MultiDataTrigger.Setters>
                    <Setter Property="Background" Value="Gray"/>
                </MultiDataTrigger.Setters>
            </MultiDataTrigger>
        </Style.Triggers>
    </Style>
    

    【讨论】:

    • 这么简单?谢谢。
    • 我经常在“输出”窗口中收到错误:System.Windows.Data 错误:4:找不到与引用'RelativeSource FindAncestor,AncestorType='Test.Controls.MyCustomDataGrid'进行绑定的源,祖先级别='1''。 BindingExpression:Path=VisualizeReadOnlyCells;数据项=空;目标元素是'DataGridCell'(名称='');目标属性是“NoTarget”(类型“对象”)。任何线索为什么?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-13
    • 2015-01-15
    • 1970-01-01
    • 1970-01-01
    • 2014-02-22
    • 1970-01-01
    相关资源
    最近更新 更多