Привязка к 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"
...>
и ваш второй пример должен работать при этом точка.