Как показать все унаследованные интерфейсы в GridControl - PullRequest
2 голосов
/ 08 мая 2019

У нас есть 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; }
    }

Интерфейс уровня 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 покажет два столбца Level1String и Level2Double, но только явно определенный элементв интерфейсе ILevel1 отображается в сетке.

Есть ли обходной путь для этого?Как мы можем получить все свойства от унаследованных интерфейсов, чтобы показать также?

1 Ответ

1 голос
/ 09 мая 2019

Немного взлома, который работает, это приведение интерфейса верхнего уровня к объекту. Он обманом заставит элемент управления сеткой автоматически генерировать столбцы на основе конкретной реализации, что даст вам все ваши свойства.

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