MVVM и DataGrid View повторно используют в качестве встроенных элементов управления в других представлениях с подмножеством данных. - PullRequest
0 голосов
/ 22 сентября 2010

Хорошо, вот ситуация.Net 4 WPF NO Silverlight.

У меня есть несколько представлений, которые представляют сетку данных, показывающую содержимое некоторых наблюдаемых коллекций, например

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

Коллекции заполняются вызовом уровня доступа к данным.Я могу достаточно легко отобразить эти данные с помощью Usercontrol, который содержит сетку данных, привязанную к соответствующей коллекции.У меня есть

  • ClassAView и ClassAViewModel для управления отображением отдельных данных ClassA,
  • ClassBView и ClassBViewModel для управления отображением отдельных данных ClassB
  • ClassCView и ClassCViewModel для управления отображением одиночных ClassC данных

У меня также есть:

  • AllClassAView и AllClassAViewModel для отображения DataGrid с данными, относящимися ко всем ClassA экземплярам.
  • AllClassBView и AllClassBViewModel для отображения DataGrid с данными, относящимися ко всем ClassB экземплярам.

    и т.д.

Теперь скажите, что ClassA содержит подмножество коллекции ClassB и подмножество ClassC коллекции и т. д.

В моем ресурсеФайл, который я связал вместе с ViewModels и их Views следующим образом (vm и vw - это пространства имен, в которых они находятся):

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

Теперь я хотел использовать AllClassBView илиAllClassBViewModel в пределах ClassAView для отображения подмножества ClassB экземпляров, которые относятся к нему.

Каков наилучший способ вызвать эти данные?

Можно ли повторно использовать AllClassBView UserControl для отображения подмножества ClassB ObservableCollection и каков наилучший способ сделать это?

Я не хочу размещать какие-либокод в файле ClassAView.cs только в файле ClassAView.xaml или ClassAViewModel .

Должен ли я просто добавить новое свойство в AllClassBViewи использовать это для фильтрации списка?Например, в ClassBViewModel, где я генерирую список ClassBViewModels (для использования в 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 голосов
/ 23 сентября 2010

Ну, я взломал его.

Возможно, моя проблема не совсем ясна.

Является ли мое решение хорошей практикой или нет, я не знаю.

Я сделал следующее:

Я поместил в 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);

Я добавил свойство и поле для моей ClassAViewModel, которые имели тип AllClassBViewModel.

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

Затем я добавил запись в AllClassBView в ClassAView, у которой контекст данных был связан со свойством AllClassBVM в ClassAViewModel.

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

Нет, все, что мне нужно сделать, это проверить привязку команды.

...