带有converterParameter的Datagrid单元格样式

Posted

技术标签:

【中文标题】带有converterParameter的Datagrid单元格样式【英文标题】:Datagrid cell style with converterParameter 【发布时间】:2017-01-28 15:10:17 【问题描述】:

如何在数据网格单元格的样式设置器中使用converterParameter? 我需要知道转换器中的元素名称或属性名称。

xaml:

<Window.Resources>
    <view:IsEnabledCellConverter x:Key="IsEnabledCellConverter"/>
    <Style x:Key="CellStyle" TargetType="x:Type DataGridCell">
        <Setter Property="IsEnabled" 
                Value="Binding 
                        Path=Item,
                        Converter=StaticResource ResourceKey=IsEnabledCellConverter, 
                        ConverterParameter=?????"
                        RelativeSource=RelativeSource AncestorType=x:Type DataGridRow />
    </Style>
.../...

<Datagrid>
     <DataGrid.Columns>
         <DataGridTextColumn x:Name="Design" 
                             CellStyle="StaticResource CellStyle" 
                             Value="Binding Path=Design"/>
         <DataGridTextColumn x:Name="FooBar" 
                             CellStyle="StaticResource CellStyle" 
                             Value="Binding Path=Foobar"/>
     </DataGrid.Columns>
</Datagrid>

转换器类:

class IsEnabledCellConverter : IValueConverter

    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    
        string p = (string)parameter;
        MyItem item = (MyItem)value;

        switch (p)
        
            case "Design":
                return string.IsNullOrEmpty(item.Reference);
                break;
            case "FooBar":
                return item.Something != true;
                break;
            default:
                return true;
        
    

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    
        throw new NotImplementedException();
    

编辑:我添加了一些细节以了解需求。 所以我所有的列 IsEnabled 道具都绑定了这个全局转换器,原因有两个:

    更容易维护 需要根据其他项目值的值启用某些列。

【问题讨论】:

在您的问题中,您要查找哪个元素名称或属性名称。 我想检索 DatagridTextColumn 的 x:name 或 Binding Path 属性,例如“Design” 这样做的任何充分理由。如果是,您可能必须使用AttachedProperty 【参考方案1】:

您应该使用DisplayIndexHeader,并相应地设置ConverterParameter

<Style x:Key="CellStyle" TargetType="x:Type DataGridCell">
    <Style.Triggers>
        <DataTrigger Binding="Binding Column.DisplayIndex, RelativeSource=RelativeSource Self" Value="0">
            <Setter Property="IsEnabled" 
                    Value="Binding 
                            Path=Item,
                            Converter=StaticResource ResourceKey=IsEnabledCellConverter, 
                            ConverterParameter=0,
                            RelativeSource=RelativeSource AncestorType=x:Type DataGridRow" />
        </DataTrigger>
        <DataTrigger Binding="Binding Column.DisplayIndex, RelativeSource=RelativeSource Self" Value="1">
            <Setter Property="IsEnabled" 
                    Value="Binding 
                            Path=Item,
                            Converter=StaticResource ResourceKey=IsEnabledCellConverter, 
                            ConverterParameter=1,
                            RelativeSource=RelativeSource AncestorType=x:Type DataGridRow" />
        </DataTrigger>
    </Style.Triggers>
</Style>

请说明这是否解决了您的问题。

【讨论】:

@ebelair 100% 它正在工作,具有适当的 ConverterParameter。我在发布前检查。 @ebelair 如果合适,你可以来聊天chat.***.com/rooms/18165/wpf 不,没关系,它正在工作。抱歉,我忘记在第一列和第二列添加 CeelStyle ^^" 但我不明白为什么这是不可能的:ConverterParameter=Column.DisplayIndex?会简单很多 @ebelair 这是因为 XAML 语法规则。你不能在任何地方写任何东西。

以上是关于带有converterParameter的Datagrid单元格样式的主要内容,如果未能解决你的问题,请参考以下文章

如何将 GridView 作为 ConverterParameter 传递

在 ConverterParameter 中使用枚举

绑定到转换器参数

x:UWP XAML 中的静态

x:UWP XAML 中的静态

带有继承的@Data注释lombok上的警告等于/哈希码