使用WPF usercontrol和MVVM

时间:2010-06-02 11:45:29

标签: wpf mvvm user-controls

我有以下问题

  1. 我的usercontrol的使用者应该分配usercontrol的DataContext还是设置一些依赖属性。 (与#3相关:如果DataContext然后我的个别项需要直接绑定到DC中给出的对象,如果DP然后我可以很好地绑定到任何VM)
  2. 如果他们设置了属性,并且我使用了3个原始项,我是应该将它们作为单独的属性接受还是将它们组合到我的用户控件的模型中
  3. 我应该让我的usercontrol的消费者向我发送模型或视图模型(我说viewmodel但是到目前为止我使用的所有控件,我从未见过有人要求我发送它们VM - 我相信有些可能是在内部实施MVVM

2 个答案:

答案 0 :(得分:2)

您的消费者想要用户控件。所以我认为用户控件应该能够在任何上下文/应用程序(WPF)中工作。所以,回答你的问题

1)使用者应设置在用户控件中定义的依赖项属性。通过使用datacontext,您将把usercontrol耦合到使用者。

2)将它们作为单独的原始属性,否则消费者需要不必要地创建一个对象以满足您的模型(再次耦合 - 为什么消费者需要了解您的模型?)。

3)不,您不应该要求消费者向您发送视图模型。为什么您需要知道哪个消费者正在使用您的“通用”用户控件。

如果由于实际考虑而无法执行上述任何操作 - 那么不要担心违反任何/所有规则,因为您的用户控制与特定上下文相结合 - 它不再是通用的。如果您编写通用用户控件,则任何WPF应用程序都可以使用您的用户控件。这是你的电话。

答案 1 :(得分:0)

1。 我会说这取决于UserControl的类型,如果它是“通用的”你应该能够改变DataContext,因为内部的控件不应该与DataContext有任何关系。例如,如果我创建一个公开属性ImageButtonCaption的{​​{1}} UserControl,那么那些应该在内部独立于DataContext绑定,在实例上可以绑定它们并且DataContext可以也可以改变,例如

ImageSource

然后可以更改DataContext以简化绑定:

<uc:ImageButton Caption="{Binding ButtonInfo.Caption}"
                ImageSource="{Binding ButtonInfo.Image}"/>

另一方面,如果UserControl是viewmodel的视图,我希望UserControl在内部绑定到viewmodel属性,相对于DataContext。

所以在DataTemplate中,当前的DataContext已经是该视图的视图模型,一个没有任何东西的简单实例应该这样做,即

<uc:ImageButton DataContext="{Binding ButtonInfo}"
                Caption="{Binding Caption}"
                ImageSource="{Binding Image}"/>

如果要传递的视图模型位于当前DataContext的属性中,您也可以绑定DataContext:

<v:StatisticsView />

2。 这可以通过我想说的方式处理,特别是如果你只有三个属性,创建它们并不是太麻烦。您可能想要考虑某些方面,例如依赖性,例如将所有三个属性组合在一个对象中是否有意义?


3。 正如在1中所指出的,这应该从UserControl本身显而易见,如果它是<v:StatisticsView DataContext="{Binding StatisticsViewModel}"/> ,则消费者应该传递StatisticsView(通过继承当前的DataContext或通过显式绑定它来隐式地)。