Wpf MVVM中ViewModels之间的耦合程度如何
我正在开发一个相当简单的WPF应用程序来显示一个对象层次结构以及所选对象的详细信息,在左窗格(树控件)中有一个Wpf MVVM中ViewModels之间的耦合程度如何,wpf,mvvm,viewmodel,Wpf,Mvvm,Viewmodel,我正在开发一个相当简单的WPF应用程序来显示一个对象层次结构以及所选对象的详细信息,在左窗格(树控件)中有一个UserControl包装一个TreeView,在右侧有另一个UserControl包装一个ListView/GridView(详细信息控件) 树控件合理地使用MVVM,并具有许多ViewModel类型,所有这些类型都派生自同一基本类型,TreeViewModel。使用中的MainWindowViewModel设置主窗口,并公开用于填充第一代树控件的TreeViewModel 但是,当我
UserControl
包装一个TreeView
,在右侧有另一个UserControl
包装一个ListView
/GridView
(详细信息控件)
树控件合理地使用MVVM,并具有许多ViewModel类型,所有这些类型都派生自同一基本类型,TreeViewModel
。使用中的MainWindowViewModel
设置主窗口,并公开用于填充第一代树控件的TreeViewModel
但是,当我想填充右侧的详细信息窗格时,我遇到了一个问题,即树控件的SelectedItem
是从TreeViewModel
派生的,因为我需要为详细信息窗格创建一个完全不同类型的ViewModel,它将使用反射将对象扩展为属性/值表
因此,问题是:
MainWindowViewModel
是否适合为树控件公开TreeViewModel
?我相信答案是肯定的,但我愿意接受相反的建议MainWindowViewModel
跟踪树中的选定项并进行自适应,将其作为另一个属性公开,但我不确定是否有更好的解决方案我不知道。在研究类似的问题时,我得出的结论是
object Tag { get; set; }
属性是不可避免的:(除了一些罕见的情况(整个树视图中只有1种类型的对象)
但是,当我想填充右侧的详细信息窗格时,我遇到了一个问题,即当我需要一个完全不同类型的ViewModel用于详细信息窗格时,树控件的SelectedItem是从TreeViewModel派生的,它将使用反射将对象扩展到属性/值表中
如果您真的非常关心这个问题,您可以构建一个高阶视图模型类,该类公开两个不同的属性—一个类型为TreeViewModel
,另一个类型为DetailsViewModel
。然后主窗口的视图模型将向树控件和details控件公开相同的对象,但是两种视图类型的l结构将彼此解耦
从逻辑上讲,树控件中选定的项和细节控件中显示的项是相同的。虽然细节控件不显示有关该项的父/子关系的信息,树控件也不显示有关该项的名称/值对的信息,但它仍然是相同的。存在可能不需要太担心一个表示某个对象的单个对象会暴露该对象只有一个视图使用的属性。希望对答案进行一些投票以确认答案……但似乎没有人会给出答案,所以我会接受这一点,因为我就是这么做的。