我有一个名为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。
答案 0 :(得分:1)
经过2个小时的思考,我找到了解决方案
将Collections
初始化移至MyCommand
以上(感谢@Spawn建议)
在xaml中为InitializeComponent
命名。然后按如下所示更改SettingsControl
绑定:
LoginCommand
这很有效。我猜测之前的绑定正在寻找{Binding MyCommand, ElementName=settingControl}
本身的 DataContext 。通过指定ElementName,wpf知道我想要的 DataContext (即LoginControl
的DataContext)。