我正在创建一个带有 DependencyProperty 的 UserControl,但 DependencyProperty 没有获得调用者传入的值。
我在自己的调查中发现了以下内容
如果我使用内置的用户控件,例如 TextBlock,一切正常。这将问题缩小到我的 UserControl 的实现(而不是调用 UserControl 的代码)
我注册的属性更改回调甚至没有被调用(嗯......至少断点没有被命中)
如果只在我使用绑定提供依赖属性时看到这个问题,那么这不起作用:
<common:MyUserControl MyDP="{Binding MyValue}"/>
但是如果我摆脱绑定并对值进行硬编码,我就没有问题,所以这是可行的:
<common:MyUserControl MyDP="hardCodedValue"/>
这是我的UserControl背后的代码:
public partial class MyUserControl : UserControl
{
public string MyDP
{
get { return (string)GetValue(MyDPProperty); }
set { SetValue(MyDPProperty, value); }
}
public static readonly DependencyProperty MyDPProperty =
DependencyProperty.Register(
"MyDP",
typeof(string),
typeof(MyUserControl),
new FrameworkPropertyMetadata(
"this is the default value",
new PropertyChangedCallback(MyUserControl.MyDPPropertyChanged)));
public static void MyDPPropertyChanged(DependencyObject obj, DependencyPropertyChangedEventArgs e)
{
((MyUserControl)obj).MyDP = (string)e.NewValue;
}
public MyUserControl()
{
InitializeComponent();
this.DataContext = this;
}
}
这是xaml
<Grid>
<TextBlock Text="{Binding MyDP}"/>
</Grid>
由于我能够使用 TextBlock 等内置用户控件,因此我认为错误不在我的主机代码中,但在这里,只是为了让您有一个完整的画面:
<StackPanel>
<common:MyUserControl MyDP="{Binding MyValue}"/>
</StackPanel>
public class MainWindowViewModel
{
public string MyValue { get { return "this is the real value."; } }
}
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
this.DataContext = new MainWindowViewModel();
}
}