2

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

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

xml代码定义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; }
    }

后面的代码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;
        }
    }

生成的数据网格

网格控件仅显示 1 级列

我们想要并且期望的是GridControl显示两列Level1String和,但只有在界面中Level2Double明确定义的项目才会显示在网格中。ILevel1

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

4

1 回答 1

2

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

DataGrid.ItemsSource = concreteItemCollection.Select(x => (object)x);
于 2019-05-09T16:25:09.890 回答