WPF MVVM一个视图多个对象类型

时间:2013-10-30 22:28:11

标签: c# wpf generics mvvm observablecollection

目前我正在学习使用MVVM的WPF,并且可能有一个疯狂的想法......

我有几个简单的类:

public class Car : IProduct
{
  public int Id {get;set;}
  public string Brand {get;set;}
  // some custom properies
}
public class Seat : IProduct
{
  public int Id {get;set;}
  public string Brand {get;set;}
  // some custom properties
}

想法是我有一个针对不同模型的编辑器视图。

public class ProductViewModel<T> : ViewModelBase, IProductViewModel<T> where T : IProduct
  {
    private T m_editorModel;
    public T EditorModel
    {
      get { return m_editorModel; }
      set
      {
        m_editorModel = value;
        RaisePropertyChanged(() => EditorModel);
      }
    }

    public Type ModelType
    {
      get { return typeof(T); }
    }
  }

可以将后置字设置为查看DataContext

 viewModel = ViewModelFactory.CreateViewModel<IProductViewModel<Car>>();
 view = ViewFactory.CreateView<ProductView>();
 view.DataContext = viewModel;
 // etc...

问题是我不知道是否可能或如何在运行时创建 ObservableCollection相同的对象EditorModel。

为每个类创建它自己的视图和视图模型或者完全不同的东西可能更容易吗?

1 个答案:

答案 0 :(得分:2)

在MVVM中[我不是在这里为大家说话],你不希望从代码中实例化视图。相反,我们使用和操纵数据。要更改视图,我们会更改视图模型,并通常在简单DataTemplate s:

中设置两者之间的连接
<DataTemplate DataType="{x:Type ViewModels:MainViewModel}">
    <Views:MainView />
</DataTemplate>
...
<DataTemplate DataType="{x:Type ViewModels:UsersViewModel}">
    <Views:UsersView />
</DataTemplate>

这样,我们不需要显式设置任何DataContext。我们可以简单地使用每个视图模型扩展的BaseViewModel属性:

public BaseViewModel ViewModel
{
    get { return viewModel; }
    set { if (viewModel != value) { viewModel = value; NotifyPropertyChanged("ViewModel"); } }
}

我们可以更改视图模型,因此可以更改这样的视图:

ViewModel = new UsersView();

然后我们可以在ContentControl中显示相关视图:

<ContentControl Content="{Binding ViewModel}" />

最后,在我看来,你真的应该为每个视图创建一个视图模型......视图模型的唯一工作就是为每个视图提供数据和功能。因此,除非您有多个相同的视图,否则您需要不同的视图模型。然而, 可能有一个所有视图都绑定的视图模型,但我建议不要使用大型应用程序。