C# 使用MVVM灯光的复杂树模型和视图模型

C# 使用MVVM灯光的复杂树模型和视图模型,c#,wpf,mvvm,binding,viewmodel,C#,Wpf,Mvvm,Binding,Viewmodel,我对MVVM有一个设计问题 我想以树状方式(简化)创建一个通用模型: 公共类modelement:ViewModelBase,imodelement { 私人估价师估价财产; 公共估价师价值 { 获取{return ValueProperty;} 设置{ValueProperty=value;RaisePropertyChanged(()=>value);} } 私人可观察到的儿童财产; 公众观察收集儿童 { 获取{return ChildrenProperty;} 设置{ChildrenPro

我对MVVM有一个设计问题

我想以树状方式(简化)创建一个通用模型:

公共类modelement:ViewModelBase,imodelement
{
私人估价师估价财产;
公共估价师价值
{
获取{return ValueProperty;}
设置{ValueProperty=value;RaisePropertyChanged(()=>value);}
}
私人可观察到的儿童财产;
公众观察收集儿童
{
获取{return ChildrenProperty;}
设置{ChildrenProperty=value;RaisePropertyChanged(()=>Children);}
}
私有财产;
公共IModelement父级
{
获取{return ParentProperty;}
设置{ParentProperty=value;RaisePropertyChanged(()=>Parent);}
}
}
然后在我的ViewModel中,我有以下属性:

private ObservableCollection<IModelElement> ListElementProperty;
public ObservableCollection<IModelElement> ListElement
{
    get { return ListElementProperty; }
    set { ListElementProperty= value; RaisePropertyChanged(() => ListElement);}
}
私有ObservableCollection ListElementProperty;
公共可观察收集列表元素
{
获取{return listlementproperty;}
设置{ListElementProperty=value;RaisePropertyChanged(()=>ListElement);}
}
每个
modelement
都绑定在视图中的一个控件上(一个
文本框
、一个
日期选择器
、一个
标签
等等)

视图中的绑定非常糟糕,我想改变这一点。我知道这不是一个可行的解决办法

因此,现在有一些方法可以实现我想要的: 通过在ViewModel中包裹模型来展平模型:确定。。。但是如果我有10个级别呢?我要建立10个视图模型

为my
ModelElement
的子元素构建类似于
ObservabledRectionary
的内容,而不是
ObservableCollection
,如果键是精心选择的字符串,则在绑定视图中会更容易理解


其他方式?有什么想法吗?我的目标是使视图中的绑定不太繁琐,保持简单和灵活…

如果您试图使用树模型,则希望将其绑定到wpf中的树控件。树控件可以很好地处理层次绑定。谢谢你的回答。我可能解释得不好。我不想在风景中造一棵树。我的模型就是这样建立的。例如:类别包含包含注释等的部分。。。所有这些元素都必须在视图中以某种形式存在,并附加到一个控件上,该控件可以是文本框或日期选择器等。。。不是树控件。好的,在这种情况下,您可能希望为每种类型构建一些datatemplates,并具有显式类型化的类,以便datetemplate可以隐式绑定到该类型的对象。例如,您知道某个类别具有节,因此您的类别数据模板具有用于显示其数据的特定控件,以及某种类型的节的列表控件,对于节等也是如此。。对于您的层次结构,那么您认为不可能像我那样为模型创建泛型类?我要建立一个分类模型,一个回顾模型等等?所以,如果我有50个级别,我必须构建50个模型类?如果每个模型有10个字段,我必须在ViewModel中为50个模型中的每个添加10个字段?即使每个班级都有差不多相同的课程?我的意思是,也许其中一些会有20个字段,但这就是为什么我想把它们放在一个列表中。。。但除此之外,元素之间的唯一区别在于,在ValueWarper中,它将是DateTime、string或Double。。。仅此而已=xh代码如何知道为任何给定类显示什么?你需要有一些明确的定义。在您的示例中,假设您有一个带有节的Category类,但是Category的值需要单选按钮,节需要组合框。如果所有内容都是泛型的,那么如果XAML只得到一个具有某种泛型值的IModelement,那么它如何知道使用哪一个呢。您可以使用泛型,但有些东西需要显式,这样您就可以对该类型的东西进行模板化
private ObservableCollection<IModelElement> ListElementProperty;
public ObservableCollection<IModelElement> ListElement
{
    get { return ListElementProperty; }
    set { ListElementProperty= value; RaisePropertyChanged(() => ListElement);}
}