c# - 获取数据网格以使用反射创建具有未知类型的列

标签 c# wpf xaml mvvm

我有 2 个 ViewModel

Case1ViewModel : ViewModelBase, ITestInterface
Case2ViewModel : ViewModelBase, ITestInterface

它们都继承自空的 ITestInterface

然后我有一个
ObservableCollection<ITestInterface>

然后我有一个我想将数据绑定(bind)到 ViewModels 的 DataGrid

在运行时它将是 Case1ViewModel 或 Case2ViewModel ,然后我希望数据网格根据列表中的 ViewModel 自动生成不同的列(一次只有一种 ViewModel 类型),atm 它只是空的(因为它只是查看界面),但我认为可以通过某种反射来实现这一点?

示例

我绑定(bind)到的集合
    public ObservableCollection<ITestInterface> Transactions
    {
        get { return _transactions; }
        set
        {
            _transactions = value;
            OnPropertyChanged(() => Transactions);
        }
    }

列表中的类示例
公共(public)类 WholesaleDialogTradeItemViewModel : ViewModelBase, ITestInterface
{
私有(private)字符串_tradeDirection;
私有(private)字符串_book;
私有(private)字符串_counterpart;
私有(private) int _volume;
私有(private)int _price;
私有(private)字符串_product;
私有(private)字符串_delivery;
私有(private)字符串 _period;
    public string TradeDirection
    {
        get { return _tradeDirection; }
        set
        {
            _tradeDirection = value; 
            OnPropertyChanged(() => TradeDirection);
        }
    }

    public string Book
    {
        get { return _book; }
        set
        {
            _book = value; 
            OnPropertyChanged(() => Book);
        }
    }

    public string Counterpart
    {
        get { return _counterpart; }
        set
        {
            _counterpart = value; 
            OnPropertyChanged(() => Counterpart);
        }
    }

    public string Product
    {
        get { return _product; }
        set { _product = value; OnPropertyChanged(() => Product); }
    }

    public string Delivery
    {
        get { return _delivery; }
        set { _delivery = value; OnPropertyChanged(()=> Delivery);}
    }

    public string Period
    {
        get { return _period; }
        set { _period = value; OnPropertyChanged(() => Period);}
    }

    public int Volume
    {
        get { return _volume; }
        set { _volume = value; OnPropertyChanged(() => Volume);}
    }

    public int Price
    {
        get { return _price; }
        set { _price = value; OnPropertyChanged(() => Price);}
    }
}

public interface ITestInterface
{
    string Counterpart { get; }
}

XAML
   <Grid>
    <Grid.RowDefinitions>
        <RowDefinition />
        <RowDefinition />
    </Grid.RowDefinitions>
    <DataGrid
        Grid.Row="0"
        Width="600"
        SelectionMode="Extended"
        SelectionUnit="FullRow"
        CanUserDeleteRows="False"
        CanUserResizeRows="False"
        IsReadOnly="True"
        AutoGenerateColumns="True"
        AutoGeneratingColumn="DataGrid_OnAutoGeneratingColumn"
        ItemsSource="{Binding Transactions, Mode=OneWay}">

    </DataGrid>
    <Grid 
        Grid.Row="1">
        <Grid.ColumnDefinitions>
            <ColumnDefinition />
            <ColumnDefinition />
        </Grid.ColumnDefinitions>
        <Button 
            Grid.Column="0"
            Margin="5,10,5,0"
            cal:Click.Command="{Binding SaveCommand}"
            Height="25">
            <AccessText>_OK</AccessText>
        </Button>
        <Button 
            Grid.Column="1"
            Margin="5,10,5,0"
            cal:Click.Command="{Binding CancelCommand}"
            Height="25">
            <AccessText>_Cancel</AccessText>
        </Button>
    </Grid>
</Grid>

这个例子的结果是我得到了 Counterpart 字符串,但是 WholesaleDialogTradeItemViewModel 中的所有其他属性都没有显示,如果我从 Interface 中删除 Counterpart 什么都不会显示

另一个例子(右击显示全尺寸)enter image description here

最佳答案

答案以替换结束

public ObservableCollection<ITestInterface> Transactions


public ObservableCollection<object> Transactions

显然,这会迫使编译器使用反射来找出要显示的内容,如果我使用接口(interface),它只会采用

关于c# - 获取数据网格以使用反射创建具有未知类型的列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20115873/

相关文章:

c# - Dapper 使用列表插入数据库

c# - WPF System.ComponentModel.Win32Exception (0x80004005) : Invalid window handle

wpf - 与 PRISM 的对话交互请求

.net - 1000个组合框绑定(bind)

c# - DataGrid 列 XAML

c# - 创建隐藏文件夹

c# - 仅在使用 Dapper 更新时忽略属性?

c# - 从 API 中检索 JSON 到 C#

c# - 缓动动画 'twitches' 完成时

c# - 隐藏元素与 DataTriggers