【发布时间】:2020-03-29 08:13:11
【问题描述】:
我有一个 UserControl 将属性绑定到控件,这似乎有效:
<UserControl x:Class="MyUserControl" Name="control">
<TextBox Text="{Binding SomeData, ElementName=control}" />
但是,获取此特定属性的信息需要设置另一个属性,该属性设置在主窗口中的InitializeComponent 之后。我的UserControl 的构造函数在InitializeComponent 中被调用,导致NullReferenceException:
public MainWindow() {
InitializeComponent(); // <-- here my UserControl is instatiated and needs Settings
Settings = new Settings();
MyUserControl.Settings = Settings; // <-- only here do we set the Settings object (which is needed in UserControl's constructor!
}
public MyUserControl {
public string SomeData {
get {
return Settings.Get("someSetting");
}
}
}
我该如何解决这个问题?还是我的架构错了(刚开始使用 WPF 和数据绑定)。
【问题讨论】:
-
XAML 中的
<UserControl .../>调用无参数构造函数。重新设计您的控件,使其能够处理稍后设置的 Settings 属性。 -
您应该将
MyUserControl绑定到MainWindow.Settings属性,该属性应该是DependencyProperty。然后将初始化从MyUserControl的构造函数移动到MyUserControl.Loaded事件处理程序。执行此处理程序时,绑定的Settings值将可用。 -
您没有提供足够的上下文来了解您已经走了多远的错误路径,但请参阅标记的重复项以获取有关处理该场景的各种方法的信息。简短版本:您的用户控件需要公开一个属性,设置数据可以绑定到该属性,优雅地处理该属性的值为 null/un-set 以及具有有效值,并在 XAML 中绑定到该属性。跨度>