Wpf MVVM中ViewModels之间的耦合程度如何

Wpf MVVM中ViewModels之间的耦合程度如何,wpf,mvvm,viewmodel,Wpf,Mvvm,Viewmodel,我正在开发一个相当简单的WPF应用程序来显示一个对象层次结构以及所选对象的详细信息,在左窗格(树控件)中有一个UserControl包装一个TreeView,在右侧有另一个UserControl包装一个ListView/GridView(详细信息控件) 树控件合理地使用MVVM,并具有许多ViewModel类型,所有这些类型都派生自同一基本类型,TreeViewModel。使用中的MainWindowViewModel设置主窗口,并公开用于填充第一代树控件的TreeViewModel 但是,当我

我正在开发一个相当简单的WPF应用程序来显示一个对象层次结构以及所选对象的详细信息,在左窗格(树控件)中有一个
UserControl
包装一个
TreeView
,在右侧有另一个
UserControl
包装一个
ListView
/
GridView
(详细信息控件)

树控件合理地使用MVVM,并具有许多ViewModel类型,所有这些类型都派生自同一基本类型,
TreeViewModel
。使用中的
MainWindowViewModel
设置主窗口,并公开用于填充第一代树控件的
TreeViewModel

但是,当我想填充右侧的详细信息窗格时,我遇到了一个问题,即树控件的
SelectedItem
是从
TreeViewModel
派生的,因为我需要为详细信息窗格创建一个完全不同类型的ViewModel,它将使用反射将对象扩展为属性/值表

因此,问题是:

  • MainWindowViewModel
    是否适合为树控件公开
    TreeViewModel
    ?我相信答案是肯定的,但我愿意接受相反的建议

  • 如何将树控件中的选定项调整为“详细信息”窗格的右ViewModel类型?一个选项似乎是,
    MainWindowViewModel
    跟踪树中的选定项并进行自适应,将其作为另一个属性公开,但我不确定是否有更好的解决方案

  • 我不熟悉WPF和MVVM模式,所以请原谅这个问题的基本性质。我已经阅读了很多关于这个模式的背景知识,查看了一些示例应用程序等,但是我找不到足够具体的东西来让我对答案充满信心。我也意识到MVVM对于一个如此简单的应用来说可能有点过头了,但我把它部分用作学习练习

    1.MainWindowViewModel是否适合公开 树控件的TreeView模型

    我相信是的。模型应该隐藏外观的逻辑,但不能隐藏逻辑结构之类的东西

    2.如何将树控件中的选定项调整到右侧 详细信息窗格的ViewModel类型? 一种选择似乎是 MainWindowViewModel跟踪 树中的选定项,并执行以下操作: 自适应,将其作为另一个 财产,但我不确定是否有 更好的解决方案


    我不知道。

    在研究类似的问题时,我得出的结论是

    object Tag { get; set; }
    
    属性是不可避免的:(除了一些罕见的情况(整个树视图中只有1种类型的对象)

    但是,当我想填充右侧的详细信息窗格时,我遇到了一个问题,即当我需要一个完全不同类型的ViewModel用于详细信息窗格时,树控件的SelectedItem是从TreeViewModel派生的,它将使用反射将对象扩展到属性/值表中

    如果您真的非常关心这个问题,您可以构建一个高阶视图模型类,该类公开两个不同的属性—一个类型为
    TreeViewModel
    ,另一个类型为
    DetailsViewModel
    。然后主窗口的视图模型将向树控件和details控件公开相同的对象,但是两种视图类型的l结构将彼此解耦


    从逻辑上讲,树控件中选定的项和细节控件中显示的项是相同的。虽然细节控件不显示有关该项的父/子关系的信息,树控件也不显示有关该项的名称/值对的信息,但它仍然是相同的。存在可能不需要太担心一个表示某个对象的单个对象会暴露该对象只有一个视图使用的属性。

    希望对答案进行一些投票以确认答案……但似乎没有人会给出答案,所以我会接受这一点,因为我就是这么做的。