2009-06-21 1 views
6

Tôi thích ý tưởng MVVM của một RelayCommand được hiển thị bởi ViewModel. Đó là tốt đẹp và thanh lịch, cho các hoạt động có thể được thực hiện mà không có thêm người dùng đầu vào. Đơn giản. Có thể kiểm tra.MVVM và các lệnh hiển thị thêm GUI

Tuy nhiên, không phải tất cả các thao tác đều không có giao diện người dùng. Một số yêu cầu xác nhận ("Bạn có chắc chắn muốn xóa không?"). Những người khác yêu cầu thêm thông tin. Việc mở một tệp có thể đòi hỏi bất cứ thứ gì từ hộp thoại Tệp Mở thông qua Trình hướng dẫn Nhập đầy đủ.

Cách tốt nhất, trong ứng dụng MVVM, để viết lệnh yêu cầu nhập của người dùng là gì? Có một mô hình được thiết lập để giải quyết vấn đề này bằng cách tiêm phụ thuộc không? Tôi có nên viết một trình xử lý KeyDown trong đoạn mã sau và có thực thi một cách rõ ràng sự kiện không? Tôi có nên quay trở lại RoutedUICommand và đặt tất cả mã "hiển thị GUI tiếp theo" trong Chế độ xem của tôi không? Hay có điều gì đó hiển nhiên là tôi hoàn toàn mất tích?

Trả lời

4

Tôi thường sử dụng Dependency Injection để tiêm một số loại IShowTheInterface trừu tượng và sau đó gọi các phương thức trừu tượng từ bên trong Command. Những phương pháp này sau đó sẽ cung cấp cho bạn các câu trả lời bạn cần để xác định xem có nên tiếp tục với hành động này hay không và những gì người dùng đưa ra.

Gần đây tôi đã sử dụng ví dụ này làm ví dụ trong blog post with a bit of a different topic.

1

Loại nội dung này (hộp thoại xác nhận, hộp thoại mở tệp, v.v.) thường được chia sẻ giữa các ứng dụng. Vì vậy, sở thích của tôi không được đặt chúng trong ViewModel.

Chế độ xemModel là ứng dụng cụ thể và không nên mở rộng ViewModelBase vô thời hạn. Thay vào đó, hãy tạo các hành vi có thể sử dụng lại để mở rộng Chế độ xem. Có quete một vài mẫu hành vi tại Expression Blend Gallery

EDIT:

Hành vi có thể có các thuộc tính và bạn có thể sử dụng các đặc tính này không chỉ để xác định đặc điểm hành vi, mà còn nhận được một số phản hồi:

<Button Content="Open Document"> 
    <i:Interaction.Behaviors> 
     <local:FileOpenBehavior 
      FileNameTarget="{Binding ElementName=tbDocName}"/> 
    </i:Interaction.Behaviors> 
</Button> 

Trong ví dụ trên, tbDocName có thể bị ẩn - hoặc bạn có thể liên kết với một thuộc tính của ModelView của bạn.

+0

Phần "hiển thị hộp thoại Mở" có thể được sử dụng lại; nhưng sau đó bạn cần phải làm một cái gì đó với tập tin đó, và đó sẽ là ứng dụng cụ thể, vì vậy tôi không chắc chắn tôi thấy cách hoạt động này. Bạn có thể đưa ra một ví dụ về cách bạn sẽ làm điều này với hành vi? –

+0

@ joe-white Gửi tin nhắn định tuyến lên ngăn xếp UI sẽ được thu thập và chuyển tiếp đến ViewModel ... Hoặc nếu bạn liên kết với thuộc tính trên ViewModel, bạn sẽ biết tệp được gán khi thuộc tính thay đổi. –