2

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

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

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

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

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

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

4

2 回答 2

3

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

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

于 2012-06-04T16:14:26.120 回答
2

这里我要指出两点——

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

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

  1. You could wrap this functionality into a new control - effectively an AutoCompleteTextBox control. This would allow you to include the "textbox" and "listview" visual elements into the control template, and bind to the completion items within Xaml.

  2. You could turn this into an attached property (or Blend behavior), which would allow you to "attach" it to a text box, and add that functionality (all within xaml). The items collection would then become a binding on the attached property (or behavior).

于 2012-06-04T16:15:42.890 回答