ICommand依赖属性未初始化

时间:2015-10-22 21:08:50

标签: c# wpf xaml

我有一个名为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中有一个按钮,其中Click事件调用此事件处理程序:

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传递给它。所以我不明白为什么它应该是null。

1 个答案:

答案 0 :(得分:1)

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

LoginCommand

这很有效。我猜测之前的绑定正在寻找{Binding MyCommand, ElementName=settingControl} 本身的 DataContext 。通过指定ElementName,wpf知道我想要的 DataContext (即LoginControl的DataContext)。