我遇到了最棘手的问题而且让我疯狂。
我已经创建了一个WPF MVVM程序,一切正常,但是,现在当我打开程序并单击一个按钮时,我收到一个System.NullReferenceException。我在发生错误的地方设置了一个断点,并且没有实例化按钮,但是,表单显示正常并且按钮是可点击的。事实上,没有任何按钮实例化(我的表单上的每个按钮都给出了相同的错误,当我在InitializeComponent()之后设置断点时,没有任何按钮显示在此下 - 所有其他组件都显示出来。
以下是按钮的示例代码:
MainWindow.xaml
<Button Content="A"
Command="{Binding KeyButtonClickCommand}"
Style="{StaticResource keyButtonStyle}" />
抛出错误的方法是在我的ViewModel中,该按钮绑定到命令:
private void keyButton_Click(object sender)
{
Button btn = (Button)sender;
string tempKey = "";
tempKey = btn.Content.ToString();
this.Key = tempKey;
}
InitializeComponent()
之后的断点
错误后的断点
就像我说的那样,早些时候工作得很好,现在只是继续使用fritz。
最让我担心的是,也许我做过一些我不应该做的事情,这可能会影响未来的项目。我只是想仔细检查一下,或者只是一个怪胎。
感谢。
答案 0 :(得分:2)
如果我正确理解你的问题,你的keyButton_Click方法的参数为null。
这很可能是因为您没有将CommandParameter传递给您的命令。如果要将按钮本身传递给命令,请尝试以下XAML。
<Button Content="A"
Command="{Binding KeyButtonClickCommand}"
CommandParameter="{Binding RelativeSource={RelativeSource Self}}"
Style="{StaticResource keyButtonStyle}" />
我确实想要注意MVVM的全部意义是不直接在ViewModel中与实际的UI层进行交互,当你将按钮传递给ViewModel时,你正是这样做的。
编辑如评论中所述,如果要将“A”作为参数传递给命令,则应将其设置为CommandParameter。
<Button Content="A"
Command="{Binding KeyButtonClickCommand}"
CommandParameter="A"
Style="{StaticResource keyButtonStyle}" />