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

时间:2019-05-08 16:47:25

标签: devexpress-wpf devexpress-gridcontrol

我们有一个GridControl,我们正在将ItemsSource分配给一系列界面项。集合中使用的接口继承自另一个接口,而我们遇到的问题是,GridControl

中仅显示直接在顶级接口中定义的项目。

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

定义GridControl的xaml代码

<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; }
    }

2级界面

    interface ILevel2
    {
        double Level2Double { get; }
    }

后面的代码用于初始化ItemsSource中的MainWindow

    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;
        }
    }

结果数据网格

Grid Control showing only Level 1 column

我们希望并期望GridControl显示两列Level1StringLevel2Double,但是仅显示在ILevel1界面中明确定义的项目在网格中。

有什么解决方法吗?我们如何从继承的接口中获取所有属性以显示出来?

1 个答案:

答案 0 :(得分:1)

可行的一点技巧是将顶级接口投射到对象。它将诱使网格控件根据具体实现自动生成列,这将为您提供所有属性。

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