【问题标题】:WPF RelayCommand not firing on button clickWPF RelayCommand 未在按钮单击时触发
【发布时间】:2019-09-28 10:04:32
【问题描述】:

我对 WPF 和 MVVM 都没有经验,所以我很可能会遗漏一些东西,但是当我单击我的按钮时,命令没有触发。我的页面上还有一些菜单控件,我以完全相同的方式设置,当我单击它们时,它们的命令按预期工作。

我已经尝试附加一个点击事件处理程序来确保按钮确实被点击了。我还尝试附加一个不同的命令,该命令适用于我的菜单控件,但不适用于按钮。

<Button Grid.Row="1" Content="Add Note" 
                                        Command="{Binding InsertNoteCommand}"/>
public ICommand InsertNoteCommand { get; }

public MainViewModel()
{
    InsertNoteCommand = new RelayCommand(InsertNote);
}

private void InsertNote()
{
    Console.WriteLine("Note Inserted!");
}

我还应该提到我正在使用 MVVM Light

【问题讨论】:

  • 看起来DataContext 不是MainViewModel。您是否在输出中遇到绑定错误?确保Button 设置了正确的DataContext,以便绑定可以解析。
  • Datacontext 是使用 MVVM light 中的一些代码设置的。我试过直接设置数据上下文,我得到了相同的结果。此外,我的页面具有数据绑定和菜单,它们的工作方式与其现在的设置方式相同。
  • 您是否检查了输出窗口中的错误消息?转到菜单并选择“调试/选项/调试/输出窗口/WPF 跟踪设置”并将“数据绑定”跟踪级别设置为“全部”或至少“警告”。现在在调试模式下运行并检查输出窗口中的输出。它将显示失败的绑定,例如在绑定源 y 上找不到属性 x
  • 另外使用 Live Visual Tree Explorer 本地化 Button。转到“调试/Windows/Live 可视化树”。选择 Button 元素后,您可以在 Live Property Explorer(“Debug/Windows/Live Property Explorer”)中查看其实际属性值。检查DataContext 是否设置为MainViewModel
  • 您好,尽快获得更好帮助的一个好方法是向我们展示您的尝试以及您遇到的确切问题。看看How to create a Minimal, Reproducible Example,通常称为MCVESSCCE

标签: c# .net wpf xaml mvvm-light


【解决方案1】:

调试信息非常有用,但最后我通过将绑定指向数据上下文解决了问题。

<Button x:Name="AddNewNoteBtn" Grid.Row="1" Content="Add Note" 
                                        Command="{Binding Path=DataContext.InsertNoteCommand,  ElementName=_window}"/>

如果有人知道如何改进这一点,我将不胜感激。谢谢!

【讨论】:

  • 为什么需要使用 elementname? Datacontext 被标记为继承,因此您设置窗口的 datacontext 并且该窗口中的按钮具有相同的 datacontext。除非您已将按钮或其父级设置为其他数据上下文,或者您的按钮不在窗口的可视树中,否则您应该能够执行 Binding InsertNoteCommand。
  • 它位于 Window.Resources 内的 DataTemplate 内,因此可能会阻止它位于可视化树内? @安迪
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-24
  • 1970-01-01
  • 2020-03-26
  • 1970-01-01
  • 2012-01-15
  • 1970-01-01
相关资源
最近更新 更多