我使用Entity Framework
访问SQL Server
上的数据,我需要在WPF DataGrid
中显示我的SQL表格中的数据。我知道如何为我的任何实体执行此操作:我使用View
创建DataGrid
:
<DataGrid ItemsSource="{Binding Rows}" SelectedItem="{Binding Row}" />
和ViewModel
ObservableCollection<PERSONS>
作为公共财产:
public class DictionaryViewModel : ViewModelBase
{
private ObservableCollection<PERSONS> rows;
public ObservableCollection<PERSONS> Rows
{
get
{
return rows;
}
set
{
rows = value;
RaisePropertyChanged("Rows");
}
}
public DictionaryViewModel()
{
Rows = new ObservableCollection<PERSONS>(myDataContext.PERSONS);
}
}
我的问题是如何为任意实体执行此操作?实体有通用类型吗?写这样的东西会很好:
public class DictionaryViewModel : ViewModelBase
{
private ObservableCollection<GenericType> rows;
public ObservableCollection<GenericType> Rows
{
get
{
return rows;
}
set
{
rows = value;
RaisePropertyChanged("Rows");
}
}
public DictionaryViewModel(GenericType type)
{
Rows = new ObservableCollection<type>(...);
}
}
我真的不想为我拥有的每个实体创建单独的ViewModel
。
感谢。
答案 0 :(得分:4)
为什么不简单地在你的班级中引入泛型参数?
public class DictionaryViewModel<T> : ViewModelBase
{
private ObservableCollection<T> _rows;
public ObservableCollection<T> Rows
{
get
{
return _rows;
}
set
{
_rows = value;
RaisePropertyChanged("Rows");
}
}
}
您只需创建2个实例(一个用于Person
,一个用于Department
)并实现网关逻辑以绑定正确的源。
编辑:
如果你想使用一个不同类型的实例......别忘了!为Person
和Department
引入基类,您可以在其中定义公共属性并将此新类型用作通用约束。
答案 1 :(得分:2)
是的,你可以这样做。您只需使用Object代替Generic Type。您的代码可能如下所示
public class ViewModelBase
{
// base class code
}
public class DictionaryViewModel : ViewModelBase
{
public DictionaryViewModel()
{
Rows = new ObservableCollection<Object>();
}
private ObservableCollection<Object> rows;
public ObservableCollection<Object> Rows
{
get
{
return rows;
}
set
{
rows = value;
RaisePropertyChanged("Rows");
}
}
}
现在Rows可以容纳任意实体。
答案 2 :(得分:0)
是的,有一个通用ObservableCollection<T>
。
<强> ObservableCollection<T> Class
强>
public class DictionaryViewModel<T> : ViewModelBase
{
private ObservableCollection<T> rows;
public ObservableCollection<T> Rows
{
get
{
return rows;
}
set
{
rows = value;
RaisePropertyChanged("Rows");
}
}
public DictionaryViewModel(IEnumerable<T> collection)
{
Rows = new ObservableCollection<T>(collection);
}
}
使用
DictionaryViewModel<Person> model =
new DictionaryViewModel<Person>(dataContext.Persons);