如何在 GridControl 中显示所有继承的接口

How to show all inherited interfaces in GridControl

我们有一个 GridControl,我们正在将 ItemsSource 分配给一组界面项。集合中使用的接口继承自另一个接口,我们 运行 遇到的问题是只有在顶级接口中直接定义的项目才会显示在 GridControl

下面是我们所看到的行为的一个非常简化的示例。

xaml 代码定义 GridControl

<Window x:Class="WpfThrowaway.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:WpfThrowaway"
        xmlns:dxg="http://schemas.devexpress.com/winfx/2008/xaml/grid"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800">
    <Grid>
        <dxg:GridControl x:Name="DataGrid" Background="#363636" Foreground="#FFFFFF" EnableSmartColumnsGeneration="True" AutoGenerateColumns="AddNew">
            <dxg:GridControl.View >
                <dxg:TableView x:Name="TableView" AllowEditing="False" />
            </dxg:GridControl.View>
        </dxg:GridControl>
    </Grid>
</Window>

具体项目实施

    class ConcreteItem : ILevel1
    {
        public string Level1String => "Level 1 string";

        public double Level2Double => 2;
    }

1 级接口(ItemsSource 集合中使用的类型)

    interface ILevel1 : ILevel2
    {
        string Level1String { get; }
    }

二级界面

    interface ILevel2
    {
        double Level2Double { get; }
    }

MainWindow

中初始化 ItemsSource 的代码
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
            var concreteItemCollection = new List<ILevel1>();
            for(var i = 0; i < 100; i++)
            {
                concreteItemCollection.Add(new ConcreteItem());
            }
            DataGrid.ItemsSource = concreteItemCollection;
        }
    }

结果数据网格

我们想要和期望的是 GridControl 显示两列 Level1StringLevel2Double,但只有 ILevel1 界面中明确定义的项目是出现在网格中。

有什么解决方法吗?我们如何让继承接口的所有属性也显示出来?

一个可行的 hack 方法是将顶层接口转换为一个对象。它会欺骗网格控件根据具体实现自动生成列,这将为您提供所有属性。

DataGrid.ItemsSource = concreteItemCollection.Select(x => (object)x);