2012-06-04 99 views
2

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

我有一个DLL,它基本上变成一个文本框和ListView为自动完成控件:

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

反正我不知道该怎么称呼该方法使用mvvm模式从视图模型。如果我在视图中引用控件,我将制定规则。

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

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

回答

3

你在这里做什么是一个纯粹的视图关注,所以我建议在视图(即代码隐藏)中做。该视图知道虚拟机及其可观察集合,为什么不让代码使用这个调用?

(我也建议看,如果你能得到一个非代码/ XAML API为“SomeDll”,但我不知道你会如何的控制力是)

2

有两件事情,我在这里指出 -

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

话虽这么说,这往往是在以下两种方式之一进行处理更优雅 -

  1. 你可以换这个功能集成到一个新的控制 - 有效的AutoCompleteTextBox控制。这将允许您将“文本框”和“列表视图”视觉元素包含到控件模板中,并绑定到Xaml中的完成项目。

  2. 你可以把它变成一个附属属性(或Blend行为),它可以让你“附加”到一个文本框,并添加该功能(全部在xaml内)。项目集合然后将成为对所附属性(或行为)的绑定。