我需要使用mvvm模式。我知道viewmodel不应该关心我读过的视图。结果我不知道如何解决这个问题:
我有一个dll,它基本上将文本框和列表视图转换为自动完成控件:
SomeDll.InitAutocomplete<string>(TextBox1, ListView1, SomeObservableCollection);
无论如何我不知道如何使用mvvm模式从viewmodel调用该方法。如果我在视图中引用控件,我将制定规则。
我是MVVM模式的新手,我的公司要求我遵循它。什么是解决这个问题最合适的方式?
我知道我可以通过将整个视图作为构造函数参数传递给viewmodel来解决它,但这将完全打破mvvm模式,因为我需要在视图中引用两个控件。
答案 0 :(得分:3)
你在这里做的是一个纯粹的视角问题,所以我建议在视图中进行(即代码隐藏)。该视图了解VM及其可观察集合,那么为什么不让后面的代码进行此调用呢?
(我还建议您查看是否可以获取“SomeDll”的非代码/ XAML API,但我不知道您可能对此有多少控制权)
答案 1 :(得分:2)
我在这里指出了两件事 -
首先,这实际上是所有视图层代码。因此,使用后面的代码不一定违反MVVM - 如果需要,您不要通过在代码中包含一些代码来桥接View-&gt; ViewModel层。
话虽如此,这通常会以两种方式之一更优雅地处理 -
您可以将此功能包装到新控件中 - 实际上是AutoCompleteTextBox
控件。这将允许您将“textbox”和“listview”可视元素包含到控件模板中,并绑定到Xaml中的完成项。
您可以将其转换为附加属性(或混合行为),这将允许您将其“附加”到文本框,并添加该功能(全部在xaml中)。然后,items集合将成为附加属性(或行为)的绑定。