2009-08-10 35 views
6

Xin vui lòng, đừng phán xét nghiêm túc nếu câu hỏi này đã được thảo luận trước đó hoặc gián tiếp được trả lời trong các lăng kính khổng lồ và mvvm gần đó. Thực hiện WPF của lớp RelayCommand hoặc DelegateCommand có một eventhandler nhưMVVM (ICommand) trong Silverlight

/// <summary> 
/// Occurs whenever the state of the application changes such that the result 
/// of a call to <see cref="CanExecute"/> may return a different value. 
/// </summary> 
public event EventHandler CanExecuteChanged 
{ 
    add { CommandManager.RequerySuggested += value; } 
    remove { CommandManager.RequerySuggested -= value; } 
} 

nhưng trong SL tập con của không gian tên không có lớp CommandManager. Và đây là nơi tôi bị mắc kẹt. Tôi chưa tìm thấy một workaround cho việc này trong MVVM chấp nhận cho SL (PRISM là quá phức tạp đối với tôi được nêu ra). Các ứng dụng HelloWorldMVVM đơn giản khác nhau không giải quyết chút nào.

Cảm ơn trước và xin lỗi vì tiếng Anh của tôi -)

Trả lời

5

Không có hỗ trợ cho lệnh trong Silverlight. Khi người dùng thao tác các điều khiển trong chế độ xem của bạn, bạn sẽ phải viết mã (ví dụ: trình xử lý sự kiện) để sửa đổi mô hình chế độ xem trong mã phía sau cho chế độ xem của bạn. Điều này có thể đơn giản như gọi phương thức trên mô hình chế độ xem khi người dùng nhấp vào nút trong chế độ xem. Bằng cách sử dụng PRISM, bạn có thể tạo các thuộc tính đính kèm trong XAML cho chế độ xem của bạn để loại bỏ các trình xử lý sự kiện này, nhưng nếu bạn không muốn sử dụng PRISM, bạn có thể chỉ cần sử dụng các trình xử lý sự kiện.

Một khía cạnh khác mà bạn sẽ phải xử lý là sửa đổi chế độ xem khi mô hình chế độ xem thay đổi. Đặc biệt, bạn sẽ muốn bật và tắt các điều khiển dựa trên trạng thái của mô hình khung nhìn. Để đạt được điều này, bạn sẽ phải liên kết thuộc tính IsEnabled của một điều khiển với một cái gì đó trong mô hình khung nhìn phản ánh nếu một phép toán nhất định được cho phép. Việc triển khai các đối tượng tùy chỉnh IValueConverter chuyển đổi thành các giá trị boolean thường hữu ích. Ví dụ: nếu mô hình xem của bạn có thuộc tính thể hiện số lượng và bạn muốn một điều khiển cụ thể trong chế độ xem chỉ được bật khi số lớn hơn 0, bạn có thể tạo bộ chuyển đổi giá trị chuyển đổi thành true khi số lớn hơn không bằng 0 và sử dụng công cụ chuyển đổi giá trị này trong ràng buộc.

Nếu bạn cố gắng điều chỉnh ví dụ WPF của ứng dụng MVVM, bạn sẽ phải loại bỏ tất cả các lệnh sử dụng và thay thế mã của riêng bạn. Mã trong ví dụ của bạn không có ý nghĩa trong Silverligt, nhưng trong WPF, nó tham gia vào quá trình xác định xem điều khiển trong chế độ xem có được hiển thị hay không, có thể nhìn thấy, v.v.

+0

Tôi nghĩ rằng bạn có một chút sai - có hỗ trợ của ICommand (có thể bị giới hạn, nhưng nó tồn tại và lớp ICommand tồn tại) trong Silverlight 2 –

+1

Đúng là giao diện 'ICommand' được định nghĩa trong Silverlight, nhưng nó không được sử dụng ở bất cứ đâu, và toàn bộ cơ sở hạ tầng chỉ huy trong WPF hoạt động rất tốt với mẫu MVVM vắng mặt trong Silverlight. –

+0

Cảm ơn. Tôi nghĩ rằng sự hiện diện của ICommand có nghĩa là hỗ trợ chỉ huy đầy đủ, vì vậy tôi đã sai - (Vì vậy, nó chỉ ra rằng MVVM thực hiện trong SL không phải là dễ dàng như vậy, như trong WPF.Tôi tìm thấy chỉ có một cách bây giờ - sử dụng propertis kèm theo và behavoir giống như này: http://blogs.southworks.net/jdominguez/2008/08/icommand-for-silverlight-with-attached-behaviors/ hoặc sử dụng khung làm việc sẵn sàng, nơi nhiều sự kiện được chấp nhận http: // nroute. codeplex.com –

5

Silverlight 4.0 hỗ trợ giao diện ICommand và do đó sẽ cung cấp WPF như cơ sở hạ tầng chỉ huy.

Các vấn đề liên quan