我有以下问题
答案 0 :(得分:2)
您的消费者想要用户控件。所以我认为用户控件应该能够在任何上下文/应用程序(WPF)中工作。所以,回答你的问题
1)使用者应设置在用户控件中定义的依赖项属性。通过使用datacontext,您将把usercontrol耦合到使用者。
2)将它们作为单独的原始属性,否则消费者需要不必要地创建一个对象以满足您的模型(再次耦合 - 为什么消费者需要了解您的模型?)。
3)不,您不应该要求消费者向您发送视图模型。为什么您需要知道哪个消费者正在使用您的“通用”用户控件。
如果由于实际考虑而无法执行上述任何操作 - 那么不要担心违反任何/所有规则,因为您的用户控制与特定上下文相结合 - 它不再是通用的。如果您编写通用用户控件,则任何WPF应用程序都可以使用您的用户控件。这是你的电话。
答案 1 :(得分:0)
1。
我会说这取决于UserControl的类型,如果它是“通用的”你应该能够改变DataContext,因为内部的控件不应该与DataContext有任何关系。例如,如果我创建一个公开属性ImageButton
和Caption
的{{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或通过显式绑定它来隐式地)。