Настройка привязки к пользовательскому DependencyProperty внутри пользовательского элемента управления WPF - PullRequest
8 голосов
/ 18 февраля 2010

У меня есть пользовательский элемент управления WPF, содержащий пользовательский объект DependencyProperty с именем MyDP. Я хочу связать это со свойством в моей ViewModel (которое вводится как DataContext UserControl). Я знаю один способ сделать это, установив привязку в объявлении UserControl в XAML родительского окна следующим образом:

<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>

Это работает нормально, но в качестве альтернативы я могу установить привязку внутри XAML UserControl, подобно тому, как я установил привязки для отдельных элементов управления внутри UserControl к другим свойствам ViewModel?

Ответы [ 2 ]

15 голосов
/ 18 февраля 2010

Вы не можете делать то, что изначально думали напрямую. Вы, вероятно, пытались и получили некоторые ошибки компиляции. Вы не можете установить встроенное пользовательское свойство в корневом XAML UserControl, потому что тип элемента - UserControl, поэтому компилятор принудительно применяет имена свойств на основе этого типа, а не вашего пользовательского типа. Вы можете обойти это, перейдя в Attached Property, но это фактически меняет значение MyDP. Вместо этого вы можете установить значение по умолчанию в стиле для UserControl и получить дополнительное преимущество, заключающееся в возможности переопределить его в любом объявленном экземпляре, просто выполнив то, что в исходном примере. Установите это под корневым элементом UserControl:

<UserControl.Style>
    <Style>
        <Setter Property="views:MyControl.MyDp" Value="{Binding Path=MyVMProperty, Mode=OneWayToSource}" />
    </Style>
</UserControl.Style>
1 голос
/ 21 октября 2014

Вы также можете определить привязку в конструкторе MainWindow, например:

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