У меня есть пользовательский элемент управления wpf, который предоставляет одно пользовательское свойство зависимости. Внутри пользовательского элемента управления текстовый блок привязывается к значению dp. Эта привязка данных работает во всех сценариях, кроме случаев, когда источником данных является объект.
Минимальный код, необходимый для воспроизведения:
это основная часть пользовательского элемента управления
<StackPanel Orientation="Horizontal">
<TextBlock Text="**SimpleUC** UCValue: "/>
<TextBlock Text="{Binding UCValue}"/>
</StackPanel>
и код управления пользователем позади:
public SimpleUC()
{
InitializeComponent();
this.DataContext = this;
}
public string UCValue
{
get { return (string)GetValue(UCValueProperty); }
set { SetValue(UCValueProperty, value); }
}
public static readonly DependencyProperty UCValueProperty =
DependencyProperty.Register("UCValue", typeof(string), typeof(SimpleUC), new UIPropertyMetadata("value not set"));
это тестовое окно. Я импортировал свое пространство имен xml проекта как "custom"
<Window.Resources>
<Style TargetType="{x:Type StackPanel}">
<Setter Property="Margin" Value="20"/>
</Style>
</Window.Resources>
<StackPanel>
<StackPanel>
<TextBlock Text="This fails to bind:"/>
<custom:SimpleUC UCValue="{Binding SomeData}"/>
</StackPanel>
<StackPanel>
<TextBlock>The same binding on a regular control like Label</TextBlock>
<Label Content="{Binding SomeData}"/>
</StackPanel>
<Slider x:Name="sld" />
<StackPanel>
<TextBlock>However, binding the UC to another element value, like a slider works</TextBlock>
<custom:SimpleUC UCValue="{Binding ElementName=sld,Path=Value}"/>
</StackPanel>
</StackPanel>
и код окна теста:
public TestWindow()
{
InitializeComponent();
this.DataContext = this;
}
//property to bind to
public string SomeData { get { return "Hello S.O."; } }
Когда я включаю диагностическую трассировку в TestWindow, он выдает ошибку «Ошибка пути BindingExpression:
'SomeData' property not found on 'object' ''SimpleUC' (Name='')' ... "
Выражение привязки такое же, как и в соседней метке, и оно работало нормально. Такое поведение кажется мне очень странным. Кто-нибудь может пролить свет?