没有初始化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传递给它。所以我不明白为什么它应该是空的

没有初始化ICommand依赖属性

经过2个小时的思考,我找到了解决方案。
MyCommand初始化移至InitializeComponent之上(感谢@Spawn的建议)在xaml中给SettingsControl命名。然后按如下方式更改LoginCommand绑定:

{Binding MyCommand, ElementName=settingControl}

这是有效的。我猜以前的绑定正在寻找LoginControl本身的DataContext。通过指定ElementName, wpf知道我想要的DataContext(即SettingsControl的DataContext)。