我有DataContext="{Binding RelativeSource={RelativeSource self}}"
在后面的代码中,我创建了一个依赖属性,如:
public static DependencyProperty ElementNameProperty = DependencyProperty.Register("ElementName",
typeof(string),
typeof(ElementControl),
new PropertyMetadata(new PropertyChangedCallback((s, e) => { new Base().OnPropertyChanged("ElementName"); })));
public string ElementName
{
get
{
return (string)base.GetValue(ElementNameProperty);
}
set
{
base.SetValue(ElementNameProperty, value);
}
}
现在,当我尝试在mainpage.xaml中使用此usercontrol并使用以下绑定:<test.TestControl ElementName="{Binding name}" />
时,它会继续在我的自定义用户控件中搜索“name”属性,而不是它应该来自哪里?
我做错了什么?
答案 0 :(得分:1)
它在那里进行搜索,因为您在用户控件的最顶层设置了DataContext
。您需要做的是在用户控件中摆脱对self的相对绑定,并在绑定中指定ElementName(在用户控件内)。顺便说一下,OnPropertyChanged
原因PropertyChangedCallback
本身可能不需要DependencyProperties
通知价值变化。
答案 1 :(得分:0)
我最终以这种方式解决了这个问题。不是我想要的方式,但它是(在我看来)非常简洁的解决方案。
<强> CustomUserControl.xaml 强>
<UserControl x:Class="TestApp.Controls.CustomUserControl"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d"
Width="75"
Height="75">
<Canvas x:Name="LayoutRoot"
Background="Black">
<StackPanel Orientation="Vertical">
<Image x:Name="UCImage"
Width="50"
Height="50"
HorizontalAlignment="Center" />
<TextBlock x:Name="UCText"
HorizontalAlignment="Center" />
</StackPanel>
</Canvas>
</UserControl>
<强> CustomUserControl.xaml.cs 强>
public partial class ElementControl : UserControl
{
#region DependencyProperty ElementNameProperty
public static DependencyProperty ElementNameProperty = DependencyProperty.Register("ElementName",
typeof(string),
typeof(ElementControl),
new PropertyMetadata(new PropertyChangedCallback((s, e) =>
{
//See Here
((ElementControl)s).UCText.Text = e.NewValue as string;
})));
public string ElementName
{
get
{
return (string)base.GetValue(ElementNameProperty);
}
set
{
base.SetValue(ElementNameProperty, value);
}
}
#endregion
}