使用该控件时的 MVVM UserControl 和绑定
Posted
技术标签:
【中文标题】使用该控件时的 MVVM UserControl 和绑定【英文标题】:MVVM UserControl and binding when using that control 【发布时间】:2014-10-02 14:20:17 【问题描述】:我用 MVVM 模式制作了一个 UserControl,其中 UserControl 的“智能”在它的 viewModel 中。
我想在不同的视图 (xaml) 中使用该 UserControl,因此该视图的开发人员不必介意它是如何完成的。
我在我的 UserControl 中添加了一些依赖属性,以便最终程序员可以为控件提供一些上下文信息。
但我有一些绑定问题。
在client.xaml中:
<Grid>
<MyUserControl MyDependencyProperty0=Binding ClientViewModelProperty0/>
</Grid>
在 myusercontrol.xaml 中
<Grid>
<TextBlock Text=Binding TextToDisplay/>
</Grid>
其中 TextToDisplay 是 MyUserControlViewModel 的一个属性。 我只需要设置一次ClientViewModelProperty0,不需要将clientViewModel设置为MyUserControl的DataContext,因为它有自己的dataContext(它的视图模型)
我认为解决方案将是不同的绑定表达式语法(相对源?自我?)但我看不出是哪一个...
【问题讨论】:
是时候让我再次复制粘贴我的“为用户控件创建视图模型是代码异味”的答案了吗?你有这个问题的原因是因为这个。想一想:TextBox 控件是否具有 TextBoxViewModel,或者它是否具有您的视图模型绑定到的属性和事件?那么为什么你的 UserControl 的行为不一样呢? One of my "don't do it!" answers 【参考方案1】:可重用控件的设计往往与成熟的应用程序视图有些不同。具体来说,他们不会以完全相同的方式遵循 MVVM。
请记住,在 WPF 中,控件是“无外观的”:它们的视觉外观由模板控制。底层类是控件的“模型”。就像@Will 在他的评论中提到的那样,TextBox
没有TextBoxViewModel
; TextBox
实例是“视图模型”。 “视图”是应用的模板。虽然UserControl
与模板化控件有点不同(它的内容是独立的,所以它实际上是“视图”和“视图模型”),但适用相同的基本规则:
当您创建自己的可重用控件时,请将您的属性和行为放在控件类本身中。这样,当您将其插入视图时,您可以随意设置参数,例如,通过将它们绑定到父视图模型。一个可重用的控件不应该依赖一些外部/环境视图模型。
【讨论】:
以上是关于使用该控件时的 MVVM UserControl 和绑定的主要内容,如果未能解决你的问题,请参考以下文章
如何从作为wpf mvvm模式中的窗口打开的视图模型中关闭用户控件?
C# mvvmlight model数据非自己定义可以绑定吗