【问题标题】:MVVM and Custom Controls?MVVM 和自定义控件?
【发布时间】:2011-12-02 11:32:44
【问题描述】:

我正在使用模块、MVVM 等开发 PRISM 应用程序。我现在非常了解 PRISM,并且我了解 MVVM 的价值。所有这些都有助于提供来自可测试性、“一致性”等的商业价值

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

例如,我需要创建查找控件,它基本上是带有按钮和弹出窗口的文本框。这个控件本身需要很多焦点控制,它需要覆盖父视图(弹出窗口)等等。使用代码隐藏创建它似乎很容易,将其粘贴到单独的库中并继续前进。我的业务表单将在我漂亮的 MVVM PRISM 中使用此控件。

所以,问题是.. 在像控件这样的孤岛中使用代码隐藏并为带来业务价值的实际代码保留 MVVM 和 TDD 是否合理?

有没有你说“这里不会使用 MVVM”的行?

【问题讨论】:

  • 请教,业务逻辑对焦点有什么了解?焦点是视图的范围。你要一条线;没有容易定义的线。你要问自己,“这是业务逻辑还是显示逻辑?”没有人能告诉你如何在每种情况下都知道这个问题的答案,你必须自己弄清楚。
  • @Will 当我想到业务逻辑时——大部分都在我模型上的验证器中。我的虚拟机只是丰富的模型和视图之间的一个垫片。通过使用 VM,我从 View 中抽象出数据访问。我正在为模型使用 DevForce,它几乎可以处理其他事情..

标签: wpf silverlight xaml mvvm


【解决方案1】:

如果代码与视图特定的属性相关,例如设置焦点,我认为使用 Code Behind 绝对没有问题。你的 ViewModel 永远不需要知道或关心谁或什么有焦点,因为这是一个特定于视图的概念。

通常我以两种方式构建 UserControl:它们要么是为特定的 Model 或 ViewModel 构建的,要么是通用的,并且它们的值由调用它们的人提供。

在前者的情况下,比如如果我想要一个SearchResultsPopup,我会构建一个UserControl,期望有一个像SearchResultsViewModel 这样的东西作为DataContext。

例如,我的 UserControl 希望在它的 DataContext 上找到以下属性,并在绑定中使用它们来构建视图。

  • ObservableCollection<SearchResult> Results
  • SearchResult SelectedResult
  • bool IsOpen
  • ICommand OkCommand
  • ICommand CancelCommand

然后我可以像这样使用 UserControl:

<local:SearchResultsPopup DataContext="{Binding MySearchResultsVM}" />

在后一种情况下,我正在创建可供任何模型或视图模型使用的通用内容,我将使用自定义依赖属性为我的 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 的反映(意味着它变成了一个 View),要么是由 View 提供的值。 ViewModel 不关心任何一种方式。

【讨论】:

    猜你喜欢
    • 2015-02-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-11
    相关资源
    最近更新 更多