wpf DataGrid单元格样式取决于数据类型

jum4pzuy  于 2023-05-01  发布在  其他
关注(0)|答案(1)|浏览(87)

我试图创建一个DataGrid CellStyle,它可以根据单元格中的数据类型来更改控制。
我已经尝试了很多方法来处理Template/ContentTemplate,ContentControl/ItemsControl和其他方法,但是除了字符串之外,没有任何东西会对任何东西做出React。我想要的是能够显示位图图像,如果这是一个单元格的数据。
数据网格的内容不是预先确定的,因此可以是各种数据,但是如果有位图,则将显示该图像。每个要显示的对象还可以有任何数量的属性。所以呢
datagrid的ItemsSource是PsCustomObject的ArrayList。如果CellStyle-setter被移除,所有数据都将显示为字符串,这是应该的。
有问题的数据网格:

<DataGrid>
        <DataGrid.Style>
            <Style TargetType="DataGrid">
                <Setter Property="AlternationCount"
                        Value="2" />
                <Setter Property="AutoGenerateColumns"
                        Value="True" />
                <Setter Property="CellStyle">
                    <Setter.Value>
                        <Style TargetType="DataGridCell" >
                            <Setter Property="Template">
                                <Setter.Value>
                                    <ControlTemplate TargetType="DataGridCell">
                                        <Grid Background="{TemplateBinding Background}">
                                            <ContentPresenter VerticalAlignment="Center" />
                                        </Grid>
                                    </ControlTemplate>
                                </Setter.Value>
                            </Setter>
                        </Style>
                    </Setter.Value>
                </Setter>
                <Setter Property="HeadersVisibility"
                        Value="Column" />
                <Setter Property="IsReadOnly"
                        Value="True" />
                <Setter Property="ItemsSource"
                        Value="{Binding RelativeSource={RelativeSource AncestorType=Grid}, Path=DataContext.Data}" />
                <Style.Triggers>
                    <Trigger Property="ItemsControl.AlternationIndex"
                             Value="0">
                        <Setter Property="Background"
                                Value="Transparent" />
                    </Trigger>
                    <Trigger Property="ItemsControl.AlternationIndex"
                             Value="1">
                        <Setter Property="Background"
                                Value="#e0e0e0" />
                    </Trigger>
                </Style.Triggers>
            </Style>
        </DataGrid.Style>
    </DataGrid>

编辑添加了关于每个对象(即行)的数据的说明

4ktjp1zp

4ktjp1zp1#

你应该可以通过使用DataGridTemplateColumnCellTemplateSelector,e来解决这个问题。例如:

<DataGrid ...>
    <DataGrid.Resources>
        <DataTemplate x:Key="StringTemplate">
            ...
        </DataTemplate>
        <DataTemplate x:Key="ImageTemplate">
            ...
        </DataTemplate>
    </DataGrid.Resources>
    <DataGrid.Columns>
        <DataGridTemplateColumn Header="...">
            <DataGridTemplateColumn.CellTemplateSelector>
                <local:CustomTemplateSelector
                            StringTemplate="{StaticResource StringTemplate}"
                            ImageTemplate="{StaticResource ImageTemplate}" />
            </DataGridTemplateColumn.CellTemplateSelector>
        </DataGridTemplateColumn>
    </DataGrid.Columns>
</DataGrid>

其思想是为XAML标记中的每种类型的对象定义一个DataTemplate,然后实现一个自定义的DataTemplateSelector,以根据数据对象的属性valye选择适当的模板。例如:

public class CustomTemplateSelector : DataTemplateSelector
{
    public DataTemplate StringTemplate { get; }
    public DataTemplate ImageTemplate { get; }

    public override DataTemplate SelectTemplate(object item, DependencyObject container)
    {
        if (item is PsCustomObject customObject)
        {
            if (customObject.SomeProperty == "...")
                return StringTemplate;
            else 
                return ImageTemplate;
        }

        return base.SelectTemplate(item, container);
    }
}

相关问题