让我们有一个buttonCommand属性绑定到自定义命令。 什么时候应该实现ICommand并从RoutedCommand派生? 我看到RoutedCommand实现了ICommand 。 在这种情况下,我需要实现一个ICommand ? 那么MVVM模型呢? 哪一个更适合这个目的?
将WPF应用程序中的VIEWMODEL绑定到VIEWMODEL类的Command非常简单。 我想为TextBox实现类似的绑定。 我有一个TextBox ,我需要将它绑定到一个Command ,当我点击回车键时TextBox被激活。 目前,我正在使用以下处理程序的KeyUp事件,但它看起来很丑…我不能把它放在我的VIEWMODEL类。 private void TextBox_KeyUp(object sender, KeyEventArgs e) { if (e.Key == System.Windows.Input.Key.Enter) { // your event handler here e.Handled = true; MessageBox.Show("Enter Key is pressed!"); } } 有一个更好的方法吗?
请参考Josh Smith的文章WPF Apps与Model-View-ViewModeldevise模式 ,特别是RelayCommand的示例实现(在图3中)。 (无需阅读整个文章的这个问题。) 一般来说,我认为这个实现是非常好的,但是我有一个关于将CanExecuteChanged订阅委托给CommandManager的RequerySuggested事件的问题。 RequerySuggested的文档状态如下: 由于这个事件是静态的,所以它只能作为一个弱引用持有处理程序。 监听这个事件的对象应该对它们的事件处理器保持强有力的引用,以避免垃圾收集。 这可以通过在附加到该事件之前或之后拥有私有字段并将该处理程序指定为值来实现。 然而, RelayCommand的示例实现并不维护订阅的处理程序: public event EventHandler CanExecuteChanged { add { CommandManager.RequerySuggested += value; } remove { CommandManager.RequerySuggested -= value; } } 这是否RelayCommand弱引用泄漏到RelayCommand的客户端,要求RelayCommand的用户了解RelayCommand的实现并自行维护一个实时引用? 如果是这样,是否有意义,例如,修改RelayCommand的实现类似于以下内容,以减轻CanExecuteChanged订阅者可能过早的GC: // This event never actually fires. It's purely lifetime mgm't. private event EventHandler canExecChangedRef; public event EventHandler CanExecuteChanged { add { CommandManager.RequerySuggested += […]
所以在这个特定的MVVM实现中,我需要几个命令。 我真的厌倦了一个一个的实现ICommand类,所以我提出了一个解决scheme,但我不知道它有多好,所以在这里任何WPF专家的input将不胜感激。 如果你能提供更好的解决scheme,甚至更好! 我所做的是一个ICommand类和两个代表,它们将一个对象作为参数,一个代表是void(用于OnExecute),另一个代表是OnCanExecute。 所以在我的ICommand(由ViewModel类调用)的构造函数中,我发送了两个方法,并在每个ICommand方法上调用委托的方法。 它工作得很好,但我不确定这是否是一个不好的方法,或者有更好的方法。 下面是完整的代码,任何input将不胜感激,甚至消极,但请build设性。 谢谢!! 视图模型: public class TestViewModel : DependencyObject { public ICommand Command1 { get; set; } public ICommand Command2 { get; set; } public ICommand Command3 { get; set; } public TestViewModel() { this.Command1 = new TestCommand(ExecuteCommand1, CanExecuteCommand1); this.Command2 = new TestCommand(ExecuteCommand2, CanExecuteCommand2); this.Command3 = new TestCommand(ExecuteCommand3, CanExecuteCommand3); } […]