Привязка к UserControl DependencyProperty

Я создал UserControl с некоторыми DependencyProperties (в Примере здесь только одно строковое свойство). Когда я создаю экземпляр Usercontrol, я могу установить свойство UserControl, и оно отображается как ожидалось. Когда я пытаюсь заменить статический текст привязкой, ничего не отображается.

мой UserControl выглядит следующим образом:

<User Control x:Class="TestUserControBinding.MyUserControl"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
             mc:Ignorable="d" 
             d:DesignHeight="30" d:DesignWidth="100">
    <Grid>
    <Label Content="{Binding MyText}"/>
  </Grid>
</UserControl>

код позади:

namespace TestUserControBinding {

  public partial class MyUserControl : UserControl {
    public MyUserControl() {
      InitializeComponent();
      this.DataContext = this;
    }

    public static readonly DependencyProperty MyTextProperty = 
                   DependencyProperty.Register(
                         "MyText", 
                          typeof(string), 
                          typeof(MyUserControl));

    public string MyText {
      get {
        return (string)GetValue(MyTextProperty);
      }
      set {
        SetValue(MyTextProperty, value);
      }
    }// MyText

  }
}

когда я пробую это в моем главном окне, все так ожидалось:

<Window x:Class="TestUserControBinding.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="clr-namespace:TestUserControBinding"
        Title="MainWindow" Height="350" Width="525">
  <StackPanel>
    <local:MyUserControl MyText="Hello World!"/>
  </StackPanel>
</Window>

но это не работает:

<Window x:Class="TestUserControBinding.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="clr-namespace:TestUserControBinding"
        Title="MainWindow" Height="350" Width="525">
  <StackPanel>
    <local:MyUserControl MyText="{Binding Path=Text}"/>
    <Label Content="{Binding Path=Text}"/>
  </StackPanel>
</Window>

поведение метки правильное, поэтому нет проблем со свойством "Text"

в чем моя ошибка? Я часами размышляю, но не могу найти ничего забытого.

1 ответов


со следующей привязкой в вашем UserControl:

<Label Content="{Binding MyText}"/>

я не уверен, как работает установка текста непосредственно в свойство MyText. Вы должны установить DataContext на UserControl где-то для этой работы.

независимо от того, эта привязка является проблемой - как я понимаю ваш сценарий, вы не хотите привязываться к DataContext на UserControl потому что это не обязательно будет иметь свойство MyText. Вы хотите привязаться к UserControl себя, и в частности the DependencyProperty вы создали. Для этого вам нужно использовать RelativeSource привязка, например:

<Label Content="{Binding RelativeSource={RelativeSource AncestorType={x:Type local:MyUserControl}}, Path=MyText}"/>

это переместится вверх по визуальному дереву в MyUserControl, а затем найдет там свойство MyText. Он не будет зависеть от DataContext, которые будут меняться в зависимости от того, где вы размещаете UserControl.

в этом случае local относится к пространству имен, которое вам нужно будет определить в UserControl:

<UserControl x:Class="TestUserControBinding.MyUserControl"
         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
         xmlns:local="clr-namespace:TestUserControBinding"
         ...>

и ваш второй пример должен работать при этом точка.