MVVM视图模型参考视图

时间:2012-06-04 16:10:58

标签: c# wpf mvvm

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

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

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

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

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

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

2 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:2)

我在这里指出了两件事 -

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

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

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

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