如何在 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
显示两列 Level1String
和 Level2Double
,但只有 ILevel1
界面中明确定义的项目是出现在网格中。
有什么解决方法吗?我们如何让继承接口的所有属性也显示出来?
一个可行的 hack 方法是将顶层接口转换为一个对象。它会欺骗网格控件根据具体实现自动生成列,这将为您提供所有属性。
DataGrid.ItemsSource = concreteItemCollection.Select(x => (object)x);
我们有一个 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
显示两列 Level1String
和 Level2Double
,但只有 ILevel1
界面中明确定义的项目是出现在网格中。
有什么解决方法吗?我们如何让继承接口的所有属性也显示出来?
一个可行的 hack 方法是将顶层接口转换为一个对象。它会欺骗网格控件根据具体实现自动生成列,这将为您提供所有属性。
DataGrid.ItemsSource = concreteItemCollection.Select(x => (object)x);