2012-07-01 15 views
6

tôi đang học MVVM cho C# Silverlight phát triển từRelayCommand trong C#

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

và tôi đang bối rối về lớp RelayCommand đề cập trong bối cảnh. Mã này là:

public class RelayCommand : ICommand 
{ 
#region Fields 

readonly Action<object> _execute; 
readonly Predicate<object> _canExecute;   

#endregion // Fields 

#region Constructors 

public RelayCommand(Action<object> execute) 
: this(execute, null) 
{ 
} 

public RelayCommand(Action<object> execute, Predicate<object> canExecute) 
{ 
    if (execute == null) 
     throw new ArgumentNullException("execute"); 

    _execute = execute; 
    _canExecute = canExecute;   
} 
#endregion // Constructors 

#region ICommand Members 

[DebuggerStepThrough] 
public bool CanExecute(object parameter) 
{ 
    return _canExecute == null ? true : _canExecute(parameter); 
} 

public event EventHandler CanExecuteChanged 
{ 
    add { CommandManager.RequerySuggested += value; } 
    remove { CommandManager.RequerySuggested -= value; } 
} 

public void Execute(object parameter) 
{ 
    _execute(parameter); 
} 

#endregion // ICommand Members 
} 

Đối với mà tôi không thực sự hiểu thế nào _execute_canExecute công trình trong trường hợp này. (Tôi mới đến C# và thậm chí không chắc chắn những gì hành động và Predicate. Tôi biết họ là đại biểu nhưng whats sự khác biệt giữa họ và làm thế nào họ hoạt động?)
Và cũng có thể, trong chương trình, tôi đã không nhận được dòng

add { CommandManager.RequerySuggested += value; } 
    remove { CommandManager.RequerySuggested -= value; } 

Ai đó có thể cho tôi giải thích về điều này, cảm ơn bạn!

Trả lời

2

Một RelayCommand đòi hỏi hai mẩu thông tin:

  1. đang gì nên chạy khi lệnh được thực thi (các _execute hành động)
  2. đang gì nên chạy để xác định nếu lệnh này có thể được thực hiện (các _canExecute vị ngữ)

An delegate đại diện cho phương thức trả về void. Trong trường hợp này, hành động _execute có một tham số (số object) và trả về void.

A Predicate là đại biểu có giá trị và trả về kết quả boolean. Trong trường hợp này, biến vị ngữ _canExecute có giá trị object và trả lại một bool.

Cả hai giá trị _execute_canExecute được cung cấp cho RelayCommand khi được tạo bởi vì đây là các phần của lệnh duy nhất cho mỗi lệnh riêng lẻ.

Về sự kiện CanExecuteChanged:

public event EventHandler CanExecuteChanged 
{ 
    add { CommandManager.RequerySuggested += value; } 
    remove { CommandManager.RequerySuggested -= value; } 
} 

Khi một thuê bao đăng ký vào sự kiện này, add được gọi và khi họ ngừng đăng ký, remove được gọi. Sự kiện CanExecuteChanged ở trên chỉ là sự kiện chuyển tiếp (tức là nếu người đăng ký đăng ký sự kiện CanExecuteChanged, họ sẽ tự động đăng ký sự kiện CommandManager.RequerySuggested). Theo MSDN, sự kiện CommandManager.RequerySuggested ...

xảy ra khi CommandManager phát hiện điều kiện có thể thay đổi khả năng thực hiện lệnh.

Tôi tin rằng một thuê bao rất có thể sẽ gọi phương thức CanExecute trên RelayCommand khi sự kiện này là bắn để xác định xem các lệnh vẫn có thể được thực thi.

1

Thêm/xóa giống như thuộc tính nhận/tập hợp nhưng thay vì sự kiện.Mã bổ sung sẽ được gọi khi

RelayCommandInstance.CanExecuteChanged += MyChangedEventHandler 

được thực thi. Mã xóa được gọi khi - = được thực thi. Bạn không thấy cú pháp này rất nhiều, vì bạn hiếm khi cần ghi đè hành vi mặc định của việc thêm/xóa đại biểu khỏi danh sách cuộc gọi sự kiện.

Trong trường hợp này, RelayCommand chỉ ánh xạ sự kiện CanExecuteChanged của nó tới sự kiện CommandManager.RequerySuggested.