使用该控件时的 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 没有TextBoxViewModelTextBox 实例“视图模型”。 “视图”是应用的模板。虽然UserControl 与模板化控件有点不同(它的内容是独立的,所以它实际上是“视图”和“视图模型”),但适用相同的基本规则:

当您创建自己的可重用控件时,请将您的属性和行为放在控件类本身中。这样,当您将其插入视图时,您可以随意设置参数,例如,通过将它们绑定到父视图模型。一个可重用的控件不应该依赖一些外部/环境视图模型。

【讨论】:

以上是关于使用该控件时的 MVVM UserControl 和绑定的主要内容,如果未能解决你的问题,请参考以下文章

如何从作为wpf mvvm模式中的窗口打开的视图模型中关闭用户控件?

WPF usercontrol mvvm

C# mvvmlight model数据非自己定义可以绑定吗

通过 MVVM 模式创建 UserControl - DataContext 并绑定到父级

wpf mvvm使用问题集锦

C# mvvmlight model数据非自己定义可以绑定吗