首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >MVVM和自定义控件?

MVVM和自定义控件?
EN

Stack Overflow用户
提问于 2011-10-06 18:14:50
回答 1查看 1.8K关注 0票数 2

我正在开发带有模块、MVVM等的PRISM应用程序。我现在很好地理解了PRISM,我也理解了MVVM的价值。所有这些都有利于交付来自可测试性、“一致性”等方面的业务价值

但现在我被某些互动问题困住了。我已经花了好几个小时看我是如何通过MVVM在Silverlight中设置焦点的。所有这些附加的行为,附加的属性,触发器。这看起来就像一堆垃圾代码,MVVM是根本原因。

例如,我需要创建Lookup控件,它基本上是带有按钮和弹出窗口的文本框。这个控件本身需要大量的焦点控制,它需要覆盖父视图(弹出窗口)等等。用代码隐藏来创建它似乎非常容易,把它放在单独的库中,然后继续前进。我的业务表单将在我的MVVM中使用这个控件。

所以问题是..。在诸如控件之类的孤岛中使用代码隐藏,并将MVVM和TDD保留在实际的代码中,从而带来业务价值,这是否合理?

有一行你说"MVVM不会在这里使用“吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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:

代码语言:javascript
运行
复制
<local:SearchResultsPopup DataContext="{Binding MySearchResultsVM}" />

在后一种情况下,我要创建一些通用的东西,可以被任何模型或ViewModel使用,我会使用自定义的依赖属性来为UserControl提供它需要绑定到的值。

所以在这个例子中,我想让DependencyProperties用于

  • bool IsOpen
  • ICommand OkCommand
  • ICommand CancelCommand

我的XAML看起来是这样的:

代码语言:javascript
运行
复制
<local:GenericPopup local:GenericPopup.IsOpen="{Binding IsPopupOpen}"
                    local:GenericPopup.SaveCommand="{Binding SavePopupCommand}"
                    local:GenericPopup.CancelCommand="{Binding HidePopupCommand}">

    <local:MySearchResultsView ... />
</local:GenericPopup>

总之,您的UserControl要么是ViewModel的反射(意思是它变成了视图),要么是视图提供的值。ViewModel不管是哪种方式都不在乎。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7678658

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档