MVVM和DataGrid View在子视图数据的其他视图中重新用作嵌入式控件

时间:2010-09-22 07:37:58

标签: c# .net wpf wpfdatagrid

好的,这是情况。 Net 4 WPF没有Silverlight。

我有几个视图提供了一个数据网格,显示了一些可观察集合的内容,例如

ObservableCollection<ClassAViewModel> sourceA;
ObservableCollection<ClassBViewModel> sourceB;
ObservableCollection<ClassCViewModel> sourceC;

通过调用数据访问层来填充集合。我可以使用包含绑定到相应集合的数据网格的Usercontrol轻松地显示此数据。 我有

  • ClassAViewClassAViewModel来 控制单ClassA的显示 数据,
  • ClassBViewClassBViewModel来 控制单个ClassB数据的显示
  • ClassCViewClassCViewModel来 控制单个ClassC数据的显示

我也有:

  • AllClassAViewAllClassAViewModel 显示带有数据的DataGrid 与所有ClassA个实例相关。
  • AllClassBViewAllClassBViewModel 显示带有数据的DataGrid 与所有ClassB个实例相关。

现在说ClassA包含ClassB集合的子集和ClassC集合的子集等。

在我的资源文件中,我以下列方式将ViewModels及其视图绑定在一起(vm和vw是它们所在的命名空间):

<DataTemplate DataType="x:Type vm:ClassAViewModel}">
  <vw:ClassAView/>
</DataTemplate>

现在我希望做的是在AllClassBView中使用AllClassBViewModelClassAView来显示与其相关的ClassB个实例的子集。

调用此数据的最佳方法是什么?

我可以重新使用AllClassBView UserControl来显示ClassB ObservableCollection的子集吗?这样做的最佳方式是什么?

我不想在 ClassAView.xaml ClassAViewModel 中的 ClassAView.cs 文件中放置任何代码。

我应该只是向AllClassBView添加一个新属性并使用它来过滤列表吗?例如,在我生成ClassBViewModel列表的ClassBViewModel中(在DataGrid中使用)我可以使用:

if(this.ClassA_Id!=0)
{
  List<ClassBViewModel> all = (from ClassB in this.DataRepository.GetClassBs().Where(x=>x.ClassA_Id == this.ClassA_Id) select new ClassBViewModel()).ToList();
}
else
{
  List<ClassBViewModel> all = (from ClassB in this.DataRepository.GetClassBs() select new ClassBViewModel()).ToList();
}

this.sourceB= new ObservableCollection<ClassBViewModel>(all);

1 个答案:

答案 0 :(得分:0)

我已经破解了它。

我的问题可能不太清楚。

我的解决方案是否是良好的做法,我不知道。

我所做的如下:

我在AllClassBViewModel中添加了一个额外的属性,允许我将ClassBViewModels的列表过滤为与ClassA相关的列表。

public ulong ClassA_Id{get;set;}

现在当AllClassBViewModel构建其ClassBViewModels列表时,它现在可以通过以下方式过滤它们:

if(this.ClassA_Id!=0)
{
  List<ClassBViewModel> all = (from ClassB in this.DataRepository.GetClassBs().Where(x=>x.ClassA_Id == this.ClassA_Id) select new ClassBViewModel()).ToList();
}
else
{
  List<ClassBViewModel> all = (from ClassB in this.DataRepository.GetClassBs() select new ClassBViewModel()).ToList();
}

this.sourceB= new ObservableCollection<ClassBViewModel>(all);

我在属于AllClassBViewModel类型的ClassAViewModel中添加了一个属性和字段。

private AllClassBViewModel fieldAllClassBViewModel;
public AllClassBViewModel AllClassBVM{get{return this.fieldAllClassBViewModel;}}

然后我将AllClassBView的条目添加到ClassAView中,该条目的数据上下文绑定到AllClassBVM中的ClassAViewModel属性。

<vw:AllClassBView DataContext="{Binding AllClassBVM}"/>

我所要做的就是检查命令绑定。