WPF XAML DataGridTemplateColumn 分配给两个具有条件类型的 DataTemplate

问题描述 投票:0回答:1

在出色的 WPF 和 XAML 中挣扎,我发现了很多信息,例如这个问题, 关于如何将多个 DataTemplate 与数据类型条件一起使用,但我不知道如何将它们连接到 DataGrid 列。

例如,要以不同的方式显示 Material 类中的数据和 Usage 类中的数据,每个类都有一个 Value 字段,这里有两个 DataTemplate:

    <Grid.Resources>
        <!-- Do NOT set the x:Key -->
        <DataTemplate DataType="{x:Type models:Material}">
            <TextBlock Text="{Binding Value}" 
                Foreground="White"
                Background="Gray"
            />
        </DataTemplate>
        <DataTemplate DataType="{x:Type models:Usage}">
            <TextBlock Text="{Binding Value}"  
                Foreground="White"
                Background="Brown"
            />
        </DataTemplate>

这应该在 DataGrid 中使用,如下所示:

<DataGridTemplateColumn CellTemplate="{StaticResource MyTemplate}">

信息是我不应该使用 DataTemplates 上的 Key 属性。如果我愿意,密钥应该是唯一的,因此每个 DataTemplates 上都不同,而两个模板都应该连接到相同的 DataGrid 列。

我还没有找到一个元素来对多个 DataTemplate 进行分组,以便为它们提供一个集体资源名称。

我还看到代码隐藏的 C# 类实现 DataTemplateSelector 的示例,但这与 XAML 中进行选择的 DataType 属性相反。

我还找不到显示此问题解决方案的 XAML 示例。非常感谢任何帮助。

wpf xaml conditional-statements datagrid datatemplate
1个回答
0
投票

我认为不可能用

DataGridTextColumn
来做你想做的事情,但用
DataGridTemplateColumn
是可行的。

<DataGrid ItemsSource="{Binding Data}" AutoGenerateColumns="False" CanUserAddRows="False">
    <DataGrid.Columns>
        <DataGridTemplateColumn Header="Values">
            <DataGridTemplateColumn.CellTemplate>
                <DataTemplate>
                    <ContentControl Content="{Binding}">
                        <ContentControl.Resources>
                            <DataTemplate DataType="{x:Type local:Usage}">
                                <TextBlock Text="{Binding Value}" Foreground="White" Background="Gray" />
                            </DataTemplate>
                            <DataTemplate DataType="{x:Type local:Material}">
                                <TextBlock Text="{Binding Value}" Foreground="White" Background="Brown" />
                            </DataTemplate>
                        </ContentControl.Resources>
                    </ContentControl>
                </DataTemplate>
            </DataGridTemplateColumn.CellTemplate>
        </DataGridTemplateColumn>
    </DataGrid.Columns>
</DataGrid>

结果

© www.soinside.com 2019 - 2024. All rights reserved.