【问题标题】:Command not triggering on button click命令未在按钮单击时触发
【发布时间】:2012-01-15 22:40:46
【问题描述】:

在我的 SL4 应用程序中,我试图从按钮触发命令。命令代码是我在其他地方毫无问题地使用过的标准代码,但是当我单击按钮时,我无法调用要调用的命令。

这让我很兴奋,所以我最终创建了一个测试页面,上面只有一个按钮。页面的数据上下文设置为我的 ViewModel,并且 ViewModel 上有一个 ICommand 属性。 DataContext 正在工作,因为我可以将文本框绑定到 ViewModel 中的字符串属性。它是如此基础,我可以在此处包含所有相关内容:

来自 XAML:

xmlns:models="clr-namespace:x3.ViewModels"

...

<UserControl.DataContext>
<models:TestViewModel/>
</UserControl.DataContext>
<Button x:Name="TestButton" Command="{Binding TestCommand}" Content="AAAAGHH" />

来自 ViewModel:

public class TestViewModel:INotifyPropertyChanged
{
  ICommand _testCommand;
  public ICommand TestCommand
  {
    get
    {
      _testCommand = new DelegateCommand(
        commandParameter =>
        {
          var testButton = commandParameter as Button;
        },
        (commandParameter) => {return true;});
      return _testCommand;
    }
  }
}

DelegateCommand 是 Telerik.Windows.Controls 的一部分。如果我在 _testCommand = 新的 DelegateCommand 当页面加载时它会被点击,但在那之后,我可以单击按钮直到我的鼠标用完,并且永远不会调用该命令。

为了我的心理健康,如果能提供任何帮助,我将不胜感激。

谢谢

米克

【问题讨论】:

  • Mick,我一般不会自己编写命令,而是使用 GalaSoft.MvvmLight 的 RelayCommands;这是开源的。语法非常简单,除了 RoutedCommand 类之外,您还可以使用 MVVM Light 中的大量工具。这可能有帮助吗?
  • 谢谢罗伯特。我有点知道我应该使用其中一个框架,但这意味着要取消一些我现有的代码,而且我到目前为止一直很懒惰。也许现在是咬紧牙关的时候了,但我仍然想知道为什么这不起作用。
  • 此外,Caliburn.Micro 是在 WPF 和 Silverlight 中开发 MVVM 应用程序的绝佳框架。

标签: c# silverlight silverlight-4.0 mvvm


【解决方案1】:

TestCommand 的 get 访问器仅被调用一次 - 当绑定引擎将 ButtonCommand 绑定到 TestCommand 属性时。将断点放在 get 的第一行,应该预计它只会被命中一次。

您需要做的是将断点放在命令运行时执行的代码上。在您的原始示例中,这意味着在委托内部中断 - 即在 return true 上。

编辑:您也可以使用System.Diagnostics.Debugger.Break() 强制调试器中断代码:

  ICommand _testCommand;
  public ICommand TestCommand
  {
    get
    {
      _testCommand = new DelegateCommand(
        commandParameter =>
        {
          var testButton = commandParameter as Button;
        },
        (commandParameter) => 
        {
          System.Diagnostics.Debugger.Break(); // Force debugger to break
          return true;
        }
      );
      return _testCommand;
    }
  }

【讨论】:

  • 谢谢罗伯。那会解释很多。里面的代码仍然没有运行,但这似乎是由于我的某种捏造。如果我仍然坚持它的本质,我可以让它发挥作用。
【解决方案2】:

为了隔离问题,请尝试使用您自己的简单 ICommand 实现,而不是 Telerik 的 DelegateCommand

如果问题仍然存在,您会知道它在您的 XAML/数据绑定附近,然后我建议您发布更完整的代码部分,以便这里的人可以帮助您。

如果问题消失,您就会知道 Telerik DelegateCommand 中的某些东西决定不调用您的 lambda。

如果您可以发布更完整的问题重现,它也可能会有所帮助。因为您只发布了代码的一小部分,所以这里可能缺少问题的原因......

【讨论】:

  • 嗨冉。在这种情况下,没有更多的代码。我创建了最基本的页面和 ViewModel 来测试它。 XAMl 有通常的 xmlns 语句,而 ViewModel 有必要的 using 语句和 RaisePropertyChanged 事件,除此之外,没有别的了。我删除了 DelegateCommand,这样 TestCommand 就只有一个 get{return _testCommand};声明,如果我在 get 上放一个断点,单击按钮时它不会被击中
  • 我听从了 Ran 的建议,并使用这个 johnpapa.net/5-simple-steps-to-commanding-in-silverlight 创建了一个非常简单的命令实现,并且成功了。你帮我找出了问题,所以现在我认为解决方案是使用上面提到的 MVVM 框架之一。
猜你喜欢
  • 1970-01-01
  • 2014-02-16
  • 2011-09-30
  • 2020-03-26
  • 2014-01-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多