设置绑定到 WPF 用户控件内的自定义 DependencyProperty
Posted
技术标签:
【中文标题】设置绑定到 WPF 用户控件内的自定义 DependencyProperty【英文标题】:Setting up binding to a custom DependencyProperty inside a WPF user control 【发布时间】:2011-01-18 02:21:15 【问题描述】:我有一个 WPF 用户控件,其中包含一个名为 MyDP 的自定义 DependencyProperty。我想将此绑定到我的 ViewModel 上的一个属性(作为 UserControl 的 DataContext 注入)。我知道一种方法是通过在父窗口的 XAML 中的 UserControl 声明中设置绑定,如下所示:
<Window x:Class="MyNamespace.Views.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:views="clr-namespace:MyNamespace.Views">
<StackPanel>
<views:MyControl MyDP="Binding Path=MyVMProperty, Mode=OneWayToSource"/>
</StackPanel>
</Window>
这很好用,但作为替代方法,我可以在 UserControl 的 XAML 中设置绑定吗,类似于我如何将 UserControl 中的各个控件的绑定设置为 ViewModel 的其他属性?
【问题讨论】:
【参考方案1】:你不能直接做你最初的想法。您可能尝试过并遇到了一些编译错误。您不能在 UserControl 的根 XAML 中设置自定义属性内联,因为元素类型是 UserControl,因此编译器会根据该类型而不是您的自定义类型强制执行属性名称。您可以通过更改为附加属性来解决此问题,但这实际上改变了 MyDP 的含义。相反,您可以在样式中为 UserControl 设置默认值,并获得额外的好处,即只需执行原始示例中的操作即可在任何声明的实例上覆盖它。将其设置在 UserControl 的根元素下:
<UserControl.Style>
<Style>
<Setter Property="views:MyControl.MyDp" Value="Binding Path=MyVMProperty, Mode=OneWayToSource" />
</Style>
</UserControl.Style>
【讨论】:
效果很好,谢谢!不是这个 WPF 菜鸟最明显的方法,但你的解释肯定能澄清情况。 谢谢。对我来说也很有效,虽然我注意到我想将 UC 绑定到数据上下文,所以 OneTime 对我来说是正确的模式。 非常有帮助。谢谢。 聪明的把戏 - 可惜编译器不够聪明,无法根据 UserControl 定义的“x:Class”属性进行类型检查【参考方案2】:您也可以在 MainWindow 的构造函数中定义绑定,如下所示:
public MainWindow()
InitializeComponent();
SetBinding(MyDPProperty, "MyVMProperty");
【讨论】:
以上是关于设置绑定到 WPF 用户控件内的自定义 DependencyProperty的主要内容,如果未能解决你的问题,请参考以下文章
我的 WPF 自定义控件 Datacontext 正在取代父母
具有依赖属性绑定到 DockPanel.Dock 附加属性的 WPF 自定义控件不起作用