【问题标题】:MVVM viewmodel reference viewMVVM 视图模型参考视图
【发布时间】:2012-06-08 17:06:04
【问题描述】:

我需要使用 mvvm 模式。我知道视图模型不应该关心我正在阅读的视图。结果我不知道如何解决这个问题:

我有一个 dll,它基本上可以将文本框和列表视图变成自动完成控件:

SomeDll.InitAutocomplete<string>(TextBox1, ListView1, SomeObservableCollection);

无论如何,我不知道如何使用 mvvm 模式从视图模型中调用该方法。如果我在视图中引用控件,我将违反规则。

我是 MVVM 模式的新手,我的公司要求我遵循它。解决这个问题的最合适的方法是什么?

我知道我可以通过将整个视图作为构造函数参数传递给视图模型来解决它,但这会完全破坏 mvvm 模式,因为我需要在视图中引用两个控件。

【问题讨论】:

    标签: c# wpf mvvm


    【解决方案1】:

    你在这里做的是一个纯粹的视图问题,所以我建议在视图中做它(即代码隐藏)。视图知道 VM 及其可观察集合,那么为什么不让后面的代码进行此调用呢?

    (我还建议您查看是否可以获得用于“SomeDll”的非代码/XAML API,但我不知道您对此有多少控制权)

    【讨论】:

      【解决方案2】:

      我要在这里指出两件事 -

      首先,这实际上是所有视图层代码。因此,使用后面的代码不一定违反 MVVM - 如果需要,您并没有通过在后面的代码中包含一些代码来桥接 View->ViewModel 层。

      话虽如此,这通常以两种方式之一更优雅地处理 -

      1. 您可以将此功能包装到一个新控件中 - 实际上是一个 AutoCompleteTextBox 控件。这将允许您将“文本框”和“列表视图”可视元素包含到控件模板中,并绑定到 Xaml 中的完成项。

      2. 您可以将其转换为附加属性(或混合行为),这将允许您将其“附加”到文本框,并添加该功能(全部在 xaml 中)。然后,项目集合将成为附加属性(或行为)的绑定。

      【讨论】:

        猜你喜欢
        • 2010-12-07
        • 1970-01-01
        • 2018-08-02
        • 2021-06-09
        • 2013-09-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-10-03
        相关资源
        最近更新 更多