我正在开发带有模块、MVVM等的PRISM应用程序。我现在很好地理解了PRISM,我也理解了MVVM的价值。所有这些都有利于交付来自可测试性、“一致性”等方面的业务价值。
但现在我被某些互动问题困住了。我已经花了好几个小时看我是如何通过MVVM在Silverlight中设置焦点的。所有这些附加的行为,附加的属性,触发器。这看起来就像一堆垃圾代码,MVVM是根本原因。
例如,我需要创建Lookup控件,它基本上是带有按钮和弹出窗口的文本框。这个控件本身需要大量的焦点控制,它需要覆盖父视图(弹出窗口)等等。用代码隐藏来创建它似乎非常容易,把它放在单独的库中,然后继续前进。我的业务表单将在我的MVVM中使用这个控件。
所以问题是..。在诸如控件之类的孤岛中使用代码隐藏,并将MVVM和TDD保留在实际的代码中,从而带来业务价值,这是否合理?
有一行你说"MVVM不会在这里使用“吗?
发布于 2011-10-06 19:53:26
如果代码与特定于视图的属性(例如设置焦点)相关,我认为使用代码背后的代码绝对没有错。您的ViewModel不应该需要知道或关心谁或什么有焦点,因为这是一个特定于视图的概念。
通常,我构建UserControls的方式有两种:它们要么是为特定的模型或ViewModel构建的,要么是泛型的,由调用它们的人提供它们的值。
在前者的情况下,比如我想要一个SearchResultsPopup
,我会构建UserControl,希望有类似于SearchResultsViewModel
的东西作为DataContext。
例如,我的UserControl希望在它的DataContext上找到以下属性,并在绑定中使用它们来构建视图。
ObservableCollection<SearchResult> Results
SearchResult SelectedResult
bool IsOpen
ICommand OkCommand
ICommand CancelCommand
然后,我可以像这样使用UserControl:
<local:SearchResultsPopup DataContext="{Binding MySearchResultsVM}" />
在后一种情况下,我要创建一些通用的东西,可以被任何模型或ViewModel使用,我会使用自定义的依赖属性来为UserControl提供它需要绑定到的值。
所以在这个例子中,我想让DependencyProperties用于
bool IsOpen
ICommand OkCommand
ICommand CancelCommand
我的XAML看起来是这样的:
<local:GenericPopup local:GenericPopup.IsOpen="{Binding IsPopupOpen}"
local:GenericPopup.SaveCommand="{Binding SavePopupCommand}"
local:GenericPopup.CancelCommand="{Binding HidePopupCommand}">
<local:MySearchResultsView ... />
</local:GenericPopup>
总之,您的UserControl要么是ViewModel的反射(意思是它变成了视图),要么是视图提供的值。ViewModel不管是哪种方式都不在乎。
https://stackoverflow.com/questions/7678658
复制相似问题