【问题标题】:Get XAML View element without breaking MVVM在不破坏 MVVM 的情况下获取 XAML 视图元素
【发布时间】:2014-08-22 06:33:45
【问题描述】:

我需要在我的 ViewModel 中引用一个 Visual(XAML 视图窗口的一个元素)以使用 VisualTreeHelper 方法,如 VisualTreeHelper.GetDescendantBounds(Visual reference),但我不想破坏 MVVM 规则,只需命名 viewport3d 并将其作为实例化我的 ViewModel 时的参考。

目前我将几何体作为这样的内容绑定到我的 ViewModel:

<Viewport3D>
     <ModelVisual3D Content="{Binding SceneContent.Content}"/>
</Viewport3D>

但我看不到 MVVM 将包含 ModelVisual3D 放入我的 ViewModel 的可能性。在 MVVM 应用程序中是否有对此的标准(可能是数据绑定)方法?

【问题讨论】:

    标签: wpf xaml mvvm


    【解决方案1】:

    使用 MVVM,我们“获取视图元素”。如果您需要对 UI 元素做某事,那么这与 MVVM 无关。如果您需要使用VisualTreeHelper.GetDescendantBounds 方法,那么再一次,这与 MVVM 完全没有关系……为什么这么多人声称使用 MVVM,却对此一无所知?

    因此,您的问题无效。在这样的情况下,你使用后面的代码是完全合适的。事实上,这是我们在遵循 MVVM 方法时应该使用背后代码的完美示例。如果它只是与 UI 相关,那么它在视图模型中没有任何意义,所以不要把它放在那里。

    请阅读What are MVVM limitations? 问题的答案,以进一步了解 MVVM。

    【讨论】:

    • 好的,我知道 MVVM 只是通过仅在某些软件单元之间使用松散耦合来开发可维护、模块化、可测试等代码的原则。但是例如我需要一种方法来获取场景的边界框以更改我的相机控件(ViewModel)。视图只是由 XAML 设计人员/专业人士制作的 UI 的 XAML 定义,因此我不想在其中添加一些进一步的逻辑。你会如何组织这个场景?相机控件(我认为它是唯一与 UI 相关的单元)是否应该成为视图的一部分?
    • 在我看来,仅 UI 控件的所有数据都应该完全存在于视图中。
    • 考虑到您的回答,我终于找到了不在我的视图中实现它的方法:我需要场景的边界框和 VisualTreeHelper 的一些选择功能。但是场景(几何)是我模型的一部分。那么为什么不在我可以访问我的模型的 ViewModel 中直接实现这些功能(没有 VisualTreeHelper)。使用 VisualTreeHelper 很花哨,但它适用于实际从我的模型生成的数据(XAML 树)的表示。尽管如此,您的回答对重新考虑我的设置很有启发。
    • 实际上我重新考虑了整个设置,现在在我的视图中实现了这些功能。我可以使用 VisualTreeHelper 的功能并实现属于视图的功能。我采取了实现封装功能的 CustomControl 的方式。
    猜你喜欢
    • 1970-01-01
    • 2011-12-04
    • 2019-10-16
    • 2011-06-26
    • 2019-06-27
    • 1970-01-01
    • 2013-08-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多