【问题标题】:RelayCommand's reference is not found未找到 RelayCommand 的引用
【发布时间】:2014-02-19 18:19:07
【问题描述】:

我有一个 WPF 应用程序,我想将其设计模式更改为 MVVM。我使用了这个 sn-p

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

using FirstMVVm.Model;
using System.ComponentModel;
using System.Windows.Input;
using System.Windows;
namespace FirstMVVm.ModelView
{
    class MyViewModel: INotifyPropertyChanged
    {
        public event PropertyChangedEventHandler PropertyChanged;
        private float result;

          public float Result
          {
           get { return result; }
              private set
              {
                  if (result != value) { 
                      result = value;
                  if (PropertyChanged != null)
                  {
                      PropertyChanged(this, new PropertyChangedEventArgs("Result"));
                  }
                     }
                    }
                 }

          public int Number { get; set; }

        private RelayCommand _calculatePerimeterCommand;

        public ICommand CalculatePerimeterCommand
                  {
                  get
                    {
                    if (_calculatePerimeterCommand == null)
                      {
                          _calculatePerimeterCommand = new RelayCommand(param => this.CalculatePerimeter());
                       }
                    return _calculatePerimeterCommand;
                       }
                      }
        private MyModel _model;

        public MyViewModel() {
            _model = new MyModel();
        }


        private void CalculatePerimeter(){
            Result = _model.Perimetre(Number);
        }

  }
}

问题是RelayCommand 类型未知,我不知道程序集缺少什么。

  • 那么我该如何解决这个问题呢?

谢谢,

【问题讨论】:

  • 我只知道 Prism 或 Unity 示例中的 RelayCommand 作为 ICommand 的示例实现。作为组件中的实现,我只知道 Prism 的 delegateCommand。你从哪里得到这个 sn-p?

标签: c# wpf mvvm command relaycommand


【解决方案1】:

RelayCommand 是 MS 创建的一个类,用于处理 WPF 中的事件或命令。您可以创建自己的课程或通过以下链接。

http://msdn.microsoft.com/en-us/magazine/dd419663.aspx

【讨论】:

    【解决方案2】:

    这不一定是RelayCommand,它只是网络上最常见示例中的类名称。

    ICommand 的机制以这样一种方式工作,而不是调用 getter 或 setter,而是在实现 ICommand 的类上调用 public void Execute(object parameter)

    让我举个例子:

    我有一个超链接,点击它时应该在将人重定向到浏览器之前做一些事情。

    XAML

    <Hyperlink NavigateUri="https://payments.epdq.co.uk/ncol/prod/backoffice/"
         Command="{Binding Path=NavigateToTakePayment}"  IsEnabled="{Binding CanTakePayment}">
         Launch Payments Portal
    </Hyperlink>
    

    现在在 viewModel 我有财产

    public ICommand NavigateToTakePayment       
    {
        get { return _navigateToTakePayment ?? (_navigateToTakePayment = new NavigateToTakePaymentCommand(this)); }
        set { _navigateToTakePayment = value; }
    }
    

    但是当点击超链接而不是像人们期望的那样触发 getter 时,NavigateToTakePaymentCommandExecute 方法被触发了。

      public class NavigateToTakePaymentCommand : ICommand
      {
            public NavigateToTakePaymentCommand(PaymentViewModel paymentViewModel)
            {
                ViewModel = paymentViewModel;
            }
    
            public PaymentViewModel ViewModel { get; set; }
    
            public bool CanExecute(object parameter)
            {
                return true;
            }
    
            public void Execute(object parameter)
            {
             //your implementation stuff goes here.
            }
    
            public event EventHandler CanExecuteChanged;
      }
    

    我希望这个示例能够阐明该机制的工作原理并为您节省一些时间。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-11
      • 2015-04-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多