2010-06-02 91 views
4

工作,我有以下问题与WPF用户控件和MVVM

  1. 如果我的用户的消费分配的用户控件的DataContext的或设置一些依赖属性。 (与#3有关:如果DataContext,那么我的单个项目需要直接绑定到DC中给定的对象,如果DP那么我有奢侈品绑定到任何VM)
  2. 如果他们设置属性,并且如果我使用3原始项目,我应该接受它们作为单独的属性,或将它们组合到一个模型为我的用户控制
  3. 我应该问我的用户控件的消费者发送给我模型或视图模型(我说viewmodel但我用过的所有控件到目前为止,我从来没有见过任何人要求我给他们VM - 我相信一些可以实现MVVM内部
+0

你的用户控件做什么?行为是否依赖于虚拟机内的某些属性?消费者通常可以自由设置/绑定他们认为合适的任何属性。大多数可以调整用户控件行为的东西都暴露为属性(DP)。 – Gishu 2010-06-02 11:51:27

+0

控制接收原始数据并对其进行消毒。 它还将抛光数据作为在UI上可见的属性进行公开。虚拟机包含将原始数据转换为抛光数据的逻辑。 – 2010-06-03 06:09:18

+1

听起来不像UserControl行为。听起来更像是一个处理/翻译/转换器类,它接受一个数据结构并输出另一个数据结构。然后你可以通过普通的WPF数据绑定将这个新的结构绑定到UI。 – Gishu 2010-06-04 05:49:47

回答

0

1. 我会说这取决于那种用户控件的,如果是“GE neric“,你应该可以改变DataContext,因为控件在内部不应该与DataContext有任何关系。例如,如果我创建了一个ImageButton用户控件,它公开了属性CaptionImageSource,那么应该在内部独立于DataContext绑定这些属性,实例上可以绑定那些数据上下文,并且也可以更改DataContext。

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

在这里,人们可以再改变的DataContext简化绑定了一下:

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

如果另一方面,用户控件是一个视图模型视图我期望的用户控件绑定到视图模型内部相对于DataContext的属性。

在一个DataTemplate在当前的DataContext已经是这一观点没有任何一个简单的实例应该做的视图模型

所以,即

<v:StatisticsView /> 

如果要通过视图模型是在当前的DataContext的属性,你可以绑定的DataContext还有:

<v:StatisticsView DataContext="{Binding StatisticsViewModel}"/> 

2. 这可以处理任何一种方式我要说的,特别是如果你哈只有三个属性并没有太多的麻烦来创建这些属性。您可能需要考虑一些方面,如依赖性,例如将一个对象中的所有三个propeties分组是否合理?


3. 如图1指出的,这应该是从该用户控件本身显而易见的,如果它是一个StatisticsView消费者应(通过继承当前的DataContext或通过显式绑定它或者隐含地)在StatisticsViewModel通过。

+0

它不像你在(1)中说的那样工作,因为如果内部我已经连接到1个datacontext,那么当外部分配一个新的datacontext时,第一个(内部的)datacontext会中断,因此功能会中断。 为什么我需要这个?好吧,我想在内部视图模型上编写nunit测试,以便我知道控件的行为是正确的。 – 2012-02-21 16:22:19

+0

@NitinChaudhari:正如我在(1)中指出的,只有* generic * UserControls不应该与DataContext有任何关系。另外为什么你需要在内部设置一个DataContext?您始终可以将其作为DataContext继承ViewModel,或者从外部明确设置它。 – 2012-02-21 16:27:50

+0

我需要内部设置它,因为我在用户界面上显示的内容是由视图模型处理的,它使得我可以保留1的eaiser,因为我可以在其上编写nunit测试。是的,我的控件将被用作多个地方的通用用户控件。 – 2012-02-21 16:36:05

2

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

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

2)把他们作为个人基本属性,否则消费者需要创建不必要的对象与您的模型,以满足(耦合再次,为什么要消费者需要了解你的模型?)。

3)不,你不应该问cosumer送你你需要知道哪些消费者在使用“通用”用户控制的观点model.Why。

如果你不能做任何上述原因实际考虑的 - 那么不要担心违反任何/所有的规则,因为你的用户conrol被加上特定的上下文是不通用的了。如果您编写通用用户控件,则任何WPF应用程序都可以使用您的用户控件。这是你的电话。