MVVM绑定网格到不同类型的EntitySet(从组合框中选择)

时间:2011-07-08 10:00:20

标签: .net silverlight mvvm ria

我正试图让我的头脑清醒,并且有一个相当简单的要求,我正在努力。

我正在使用RIA服务,在我的模型中,我有3个实体代表数据库中的视图。

在我的XAML视图中,我有一个组合框,允许用户从数据库中选择一个特定的视图,我有一个数据网格,应该显示用户选择的结果。我遇到的问题是,DomainContext.Load方法(当用户从​​ComboBox中选择一个项时调用)返回特定类型的EntitySet(IE EntitySet< Servers>或EntitySet< Apps>),具体取决于哪个视图是地选择。

我需要将网格绑定到我的ViewModel中的属性,但不能声明一个属性来保存EntitySet来自Load操作,因为每个Load操作都返回不同类型的EntitySet(< Apps>,< ;服务器>例如)。

是否存在可以将网格绑定到的通用类型,还将EntitySet转换为?

或者,我这样做完全错了吗?所有建议都欢迎,因为我正在挣扎:)

由于

米克

2 个答案:

答案 0 :(得分:0)

使用2个不同的DataGrid控件(一个用于Apps,一个用于Servers)并在需要时隐藏/显示。您可能想要独立地自定义它们。

永远不要过于复杂,例如通过共享控件,仅仅因为GUI元素看起来相似。将它们视为ServerDataGrid控件和AppDataGrid控件。

答案 1 :(得分:0)

在视图模型上公开一个属性,用于管理要显示的项目列表:

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绑定到此属性。定义DataTemplates以使WPF解析显示相应DataGrid的正确视图:

<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将根据您定义的DataTemplates自动解析正确的视图。当然,如上所示,您不希望通过定义控件中的数据模板将视图与VM紧密耦合,因此请将它们放在最适合您的位置。