代码之家  ›  专栏  ›  技术社区  ›  Tim Trout

在WPF用户控件内设置与自定义DependencyProperty的绑定

  •  8
  • Tim Trout  · 技术社区  · 16 年前

    我有一个WPF UserControl,其中包含一个名为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的其他属性?

    2 回复  |  直到 16 年前
        1
  •  15
  •   John Bowen    16 年前

    你不能直接做你原本想做的事。您可能尝试过并得到了一些编译错误。无法在UserControl的根XAML中内联设置自定义属性,因为元素类型是UserControl,因此编译器将基于该类型而不是自定义类型强制属性名称。您可以通过更改为附加属性来解决此问题,但这实际上改变了MyDP的含义。相反,您可以在UserControl的样式中设置一个默认值,并通过执行原始示例中的操作,在任何声明的实例上重写它,从而获得额外的好处。在UserControl的根元素下设置:

    <UserControl.Style>
        <Style>
            <Setter Property="views:MyControl.MyDp" Value="{Binding Path=MyVMProperty, Mode=OneWayToSource}" />
        </Style>
    </UserControl.Style>
    
        2
  •  1
  •   Horpe    11 年前

    您还可以在MainWindow的构造函数中定义绑定,如下所示:

    public MainWindow()
    {
        InitializeComponent();
        SetBinding(MyDPProperty, "MyVMProperty");
    }