我使用MVVM模式创建了一个UserControl,其中UserControl的“智能”位于其viewModel中。
我想在不同的视图(xaml)中使用UserControl,因此该视图的开发人员不必考虑它是如何完成的。
我在UserControl中添加了一些dependencyProperties,因此最终程序员可以为控件提供一些上下文信息。
但我有一些约束性问题。
在client.xaml:
中<Grid>
<MyUserControl MyDependencyProperty0={Binding ClientViewModelProperty0}/>
</Grid>
和myusercontrol.xaml
<Grid>
<TextBlock Text={Binding TextToDisplay}/>
</Grid>
其中TextToDisplay是MyUserControlViewModel的属性。 我只需要设置一次ClientViewModelProperty0,我不需要将clientViewModel设置为MyUserControl的DataContext,因为它有自己的dataContext(它的视图模型)
我假设解决方案是一个不同的Binding Expression语法(相对来源?self?)但是我看不出哪个...
答案 0 :(得分:2)
可重复使用的控件往往采用与完整应用程序视图不同的设计。具体来说,他们不会以完全相同的方式关注MVVM。
请记住,在WPF中,控件是“无形的”:它们的视觉外观由模板控制。基础类是&#34;模型&#34;为了控制。就像@Will在评论中提到的那样,TextBox
没有TextBoxViewModel
; TextBox
实例是&#34;视图模型&#34;。 &#34;视图&#34;是应用的模板。虽然UserControl
与模板化控件略有不同(其内容是自包含的,但它实际上 &#34; view&#34;以及& #34;查看模型&#34;),适用相同的基本规则:
创建自己的可重用控件时,请将属性和行为放在控件类中。这样,当您将其插入视图时,您可以设置您喜欢的参数,例如,通过将它们绑定到父视图模型。可重用控件永远不应该依赖于某些外部/环境视图模型。