0

目前我正在使用 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...

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

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

4

1 回答 1

2

在一般的 MVVM 中[我不是在这里为所有人说话],您不希望从代码中实例化视图。相反,我们使用和操作数据。DataTemplate为了改变视图,我们改变视图模型,并经常在 simple s中设置两者之间的连接:

<DataTemplate DataType="{x:Type ViewModels:MainViewModel}">
    <Views:MainView />
</DataTemplate>
...
<DataTemplate DataType="{x:Type ViewModels:UsersViewModel}">
    <Views:UsersView />
</DataTemplate>

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

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

我们可以更改视图模型,因此视图如下:

ViewModel = new UsersView();

然后我们可以像这样显示相关视图ContentControl

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

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

于 2013-10-30T22:48:55.210 回答