MVVM Привязка сетки к различным типам EntitySets (выбирается из выпадающего списка) - PullRequest
1 голос
/ 08 июля 2011

Я пытаюсь разобраться с MVVM, и у меня довольно простое требование, с которым я борюсь.

Я пользуюсь услугами RIA, и в моей модели у меня 3сущности, представляющие представления из БД.

В моем представлении XAML на данный момент у меня есть поле со списком, которое позволяет пользователю выбрать конкретное представление из БД, и у меня есть сетка данных, которая должна отображать результаты извыбор пользователей.У меня проблема в том, что метод DomainContext.Load (вызывается, когда пользователь выбирает элемент из ComboBox) возвращает EntitySet определенного типа (IE EntitySet или EntitySet ), в зависимости от того, какое представление являетсяselected.

Мне нужно привязать сетку к свойству в моей ViewModel, но я не могу объявить только одно свойство для хранения EntitySet из операции Load, так как каждая операция Load возвращает свой тип EntitySet (, например).

Существует ли универсальный тип, к которому я могу привязать свою сетку, а также преобразовать EntitySets в?

Или я делаю это совершенно неправильно??Все предложения приветствуются, поскольку я колеблюсь:)

Спасибо

Мик

Ответы [ 2 ]

0 голосов
/ 08 июля 2011

Предоставьте свойство в вашей модели представления, которое управляет списком элементов, которые вы хотите отобразить:

public class MainViewModel
{
  public INotifyPropertyChanged ListVM { get; private set; }

  public SetList()
  {
    if(whatever)
      ListVM = new ServerListViewModel(myServers);
    else
      ListVM = new AppListViewModel(myApps);

    OnPropertyChanged("ListVM");
  }
}

Привязать ContentPresenter или ContentControl к этому свойству. Определите шаблоны данных, чтобы WPF разрешил правильное представление, отображающее соответствующую сетку данных:

<UserControl
  x:Class="Foo.MainView"
  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  xmlns:myNS="clr-namespace:Foo"
  >

  <UserControl.Resources>
    <DataTemplate DataType="{x:Type myNS:ServerListViewModel}">
      <myNS:ServerListView />
    </DataTemplate>
    <DataTemplate DataType="{x:Type myNS:AppListViewModel}">
      <myNS:ServerListView />
    </DataTemplate>
  </UserControl.Resources>

  <ContentPresenter Content="{Binding ListVM}" />
</UserControl>

Когда вы заполняете это свойство ListVM различными моделями представлений, WPF автоматически разрешит правильное представление на основе определенных вами шаблонов данных. Конечно, вы не захотите тесно связывать свое представление с виртуальными машинами, определяя шаблоны данных в элементе управления, как я показал выше, поэтому размещайте их там, где это наиболее удобно для вас.

0 голосов
/ 08 июля 2011

Используйте 2 разных элемента управления DataGrid (один для Apps и один для Servers) и скрывайте / отображайте при необходимости. Скорее всего, вы все равно можете настроить их самостоятельно.

Никогда не усложняйте вещи, например разделяя элементы управления, просто потому, что элементы GUI кажутся похожими. Думайте о них как о элементе управления ServerDataGrid и элементе управления AppDataGrid.

...