2014-01-28 5 views
4

У меня есть приложение WPF, в котором я хотел бы изменить свой шаблон дизайна для MVVM .I использовал этот фрагментRelayCommand является не найдена

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 типа не известна и Я не знаю, что отсутствует.

  • Так как я могу исправить эту проблему?

Спасибо,

+1

Я знаю только RelayCommand из примера Prism или Unity в качестве примера реализации ICommand. Как воплощение в собрании я знаю только делегата Коменда из Призма. Где у вас этот фрагмент? – Sukram

ответ

1

Это не обязательно должен быть RelayCommand это просто имя класса из наиболее распространенных, например в Интернете.

Механизм ICommand работ таким образом, что вместо того, чтобы геттер или сеттера Называние вы получите public void Execute(object parameter) быть призвало класса, который реализует ICommand

Позвольте мне дать вам пример:

У меня есть гиперссылка, которая при нажатии должна делать некоторые вещи, прежде чем перенаправить человека в браузер.

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; } 
} 

но при гиперссылке вместо добытчика увольняет, как можно было бы ожидать NavigateToTakePaymentCommand класса Execute метода запускаемого вместо этого.

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; 
    } 

Надеюсь, что этот пример пояснит, как работает механизм, и сэкономит вам некоторое время.