没有初始化ICommand依赖属性
本文关键字:依赖 属性 ICommand 初始化 | 更新日期: 2023-09-27 18:19:02
我有一个名为LoginControl
的UserControl,其中我定义了Command
:
//This is LoginControl
public ICommand LoginCommand
{
get { return (ICommand)GetValue(LoginCommandProperty); }
set { SetValue(LoginCommandProperty, value); }
}
public static readonly DependencyProperty LoginCommandProperty =
DependencyProperty.Register("LoginCommand",
typeof(ICommand),
typeof(LoginControl));
我在LoginControl
中有一个按钮,点击事件调用此事件处理程序:
private void Login_Click(object sender, RoutedEventArgs e)
{
LoginCommand.Execute(passwordBox.Password);
}
现在我有另一个名为SettingsControl
的UserControl,其中包括LoginControl
:
<local:LoginControl Grid.Row="1" Margin="5" LoginCommand="{Binding MyCommand}"/>
SettingsControl
的DataContext设置为自身:DataContext="{Binding RelativeSource={RelativeSource Self}}
SettingsControl
的定义如下:
public partial class SettingsControl : UserControl
{
public SettingsControl()
{
InitializeComponent();
MyCommand = new RelayCommand(o => MessageBox.Show("YESSS!"));
}
public ICommand MyCommand { get; set; }
}
当Login_Click
事件处理程序被调用时,代码抛出一个NullReferenceException (MyCommand
为null)。我不明白为什么。如图所示,MyCommand
已被初始化。当我初始化LoginControl
时,我将MyCommand
传递给它。所以我不明白为什么它应该是空的
经过2个小时的思考,我找到了解决方案。
将MyCommand
初始化移至InitializeComponent
之上(感谢@Spawn的建议)在xaml中给SettingsControl
命名。然后按如下方式更改LoginCommand
绑定:
{Binding MyCommand, ElementName=settingControl}
这是有效的。我猜以前的绑定正在寻找LoginControl
本身的DataContext。通过指定ElementName, wpf知道我想要的DataContext(即SettingsControl
的DataContext)。