MVVM 视图模型引用视图

本文关键字:视图 引用 模型 MVVM | 更新日期: 2023-09-27 18:36:17

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

我有一个dll,基本上将文本框和列表视图转换为自动完成控件:

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

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

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

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

MVVM 视图模型引用视图

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

(我还建议看看您是否可以为"SomeDll"获得非代码/XAML API,但我不知道您可以对此进行多少控制)

我要在这里指出两件事 -

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

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

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

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