我有 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 什么都不会显示
另一个例子(右击显示全尺寸)
最佳答案
答案以替换结束
public ObservableCollection<ITestInterface> Transactions
和
public ObservableCollection<object> Transactions
显然,这会迫使编译器使用反射来找出要显示的内容,如果我使用接口(interface),它只会采用
关于c# - 获取数据网格以使用反射创建具有未知类型的列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20115873/