Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/279.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# WPF MVVM一视图多对象类型_C#_Wpf_Generics_Mvvm_Observablecollection - Fatal编程技术网

C# WPF MVVM一视图多对象类型

C# WPF MVVM一视图多对象类型,c#,wpf,generics,mvvm,observablecollection,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;}

目前我正在用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); }
    }
  }
公共类ProductViewModel:ViewModelBase,IPProductViewModel其中T:IPProduct
{
私有T m_编辑器模型;
公共编辑模型
{
获取{return m_editorModel;}
设置
{
m_editorModel=值;
RaisePropertyChanged(()=>EditorModel);
}
}
公共类型模型类型
{
获取{return typeof(T);}
}
}
可以将其设置为“查看数据上下文”

 viewModel = ViewModelFactory.CreateViewModel<IProductViewModel<Car>>();
 view = ViewFactory.CreateView<ProductView>();
 view.DataContext = viewModel;
 // etc...
viewModel=ViewModelFactory.CreateViewModel();
view=ViewFactory.CreateView();
view.DataContext=viewModel;
//等等。。。
问题是,我不知道是否可能或者如何在运行时创建 同一对象编辑器模型的可观察集合


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

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

<DataTemplate DataType="{x:Type ViewModels:MainViewModel}">
    <Views:MainView />
</DataTemplate>
...
<DataTemplate DataType="{x:Type ViewModels:UsersViewModel}">
    <Views:UsersView />
</DataTemplate>
我们可以更改视图模型,从而更改如下视图:

ViewModel = new UsersView();
<ContentControl Content="{Binding ViewModel}" />
然后我们可以在
ContentControl
中显示相关视图,如下所示:

ViewModel = new UsersView();
<ContentControl Content="{Binding ViewModel}" />


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

您的意思是在ProductViewModel类中添加ObservableCollection吗?你的问题是否与你的潜在可观测集合包含不同种类的对象但绑定到同一个控件有关?是的。ObservableCollection应该在某些listview控件中可见。也许我累了,我没有注意到我可以做
public observetecollection SomeModels=new observetecollection()。现在将它们绑定到视图;)最后,我就是这样走的。谢谢