2010-09-18 66 views
5

MVVM không cho phép mã phía sau và do đó xử lý sự kiện. Vậy cách MVVM được thông báo là một ô đã được thay đổi là gì?Làm thế nào để xử lý sự kiện Wpf DataGrid CellEditEnding trong MVVM?

+0

Có vẻ như một câu hỏi hợp pháp với tôi, nhưng có thể bạn cần phải tiết lộ chi tiết hơn một chút với câu hỏi của mình: chính xác thì bạn không hiểu gì về việc xử lý sự kiện đó? Bạn có muốn biết liệu nó có nên được thực hiện trong chế độ xem hoặc chế độ xem không? * (Đây là gợi ý: ViewModel không biết gì về DataGrid). * – slugster

+0

@slugster - Rõ ràng là tôi không thể sử dụng sự kiện này vì MVVM không cho phép Code Behind. Vì vậy, câu hỏi của tôi là những gì tôi có thể làm thay vì sử dụng sự kiện này? – Erez

+2

MVVM không * cấm * mã phía sau, nó đơn giản * ngăn cản * nó và cung cấp cho bạn một mẫu để đạt được điều đó lý tưởng. Chính xác những gì bạn cần phải làm một khi tế bào dữ liệu được thay đổi (câu trả lời của bạn có thể quyết định cách tiếp cận để có)? – slugster

Trả lời

1

Câu hỏi khá hợp lý và rõ ràng của nó vì có các giải pháp khá hợp lý cho vấn đề đối với MVVM. Tôi đoán ai đó đã đánh dấu nó xuống bởi vì điều này có thể đã được hỏi vô số lần trước đó.

Tôi biết có điều gì đó được tích hợp để thực hiện việc này trong .Net4. Tôi bị mắc kẹt tại. Net3.5 vì vậy tôi sử dụng lớp CommandReference từ bộ công cụ WPF, để chuyển đổi một sự kiện trong dạng xem thành một lệnh trong một viewmodel.

+0

Giải pháp cho vấn đề cho MVVM là xử lý sự kiện, tôi nghĩ vậy. :) –

+0

Nhưng 'làm thế nào' là câu hỏi !! Bạn không thể thêm trình xử lý sự kiện mà không phá vỡ MVVM. Tham chiếu lệnh cho phép bạn chuyển đổi một sự kiện trong giao diện người dùng thành lệnh trong máy ảo. – NVM

0

Bạn có cần xử lý Sự kiện CellEditEnding không? Nó sẽ là một khả năng để thực thi mã trong setter của tài sản đó là ràng buộc với các tế bào?

-1

"MVVM không cho phép mã phía sau và do đó xử lý sự kiện".

Rất tiếc! Có vấn đề.

MVVM không khuyến khích mã phía sau, đó là sự thật, nhưng chỉ khi nào đó có thể được thực hiện một cách hợp lý thông qua Xaml. "Bạn sẽ không viết mã" chưa bao giờ được ai nói với một đầu mối.

Đôi khi xử lý sự kiện là cách đơn giản nhất, tốt nhất để đạt được mục tiêu của bạn. Khi đó là tình huống, hãy ôm lấy nó, giải quyết vấn đề của bạn, và tiếp tục. Đôi khi thậm chí không thể hoàn thành mục tiêu của bạn trong XAML. Trong những trường hợp đó, hãy ném logic xem trong mã của chế độ xem và tiếp tục.

Điều quan trọng hơn là duy trì mục tiêu kiến ​​trúc của MVVM (tách mối quan tâm giữa các lớp) hơn là tuân thủ nghiêm ngặt các quy tắc-ngón tay cái (chẳng hạn như tránh viết mã). , bạn đang thiếu rừng cho cây cối.

+0

Vâng, bạn đúng và bạn đã sai. Nếu bạn đang thêm một số mã phía sau chỉ để làm một số công cụ hoàn toàn giao diện người dùng của nó tốt. Nhưng nói rằng nếu sự kiện kết thúc chỉnh sửa ô sẽ cập nhật một cái gì đó trong mô hình của bạn (thông qua máy ảo của bạn) thì đó là một ý tưởng rất xấu (IMO). – NVM

+0

Nó phụ thuộc vào cách mô hình của bạn phù hợp để làm việc trong một DataGrid. Trong một tình huống tôi có @work ngay bây giờ, ví dụ, tôi đang bị buộc phải sử dụng một datagrid hàng đơn để đại diện cho một mục duy nhất.VM sẽ không để lộ một bộ sưu tập các mục này mà chỉ có thể chứa một cá thể, đó là một sự nhượng bộ vô lý ở phía VM cho một phép lạ lạ lùng trong V. Thay vào đó, V có trách nhiệm chuyển đổi những gì VM trưng ra như một ứng dụng thực tế cần vào những gì nó yêu cầu. –

+0

Tôi không chắc tôi hiểu kịch bản của bạn là gì. Nhưng tôi không đồng ý với tuyên bố rằng "khung nhìn có trách nhiệm chuyển đổi những gì VM trưng ra". Chế độ xem có trách nhiệm 'hiển thị' những gì VM hiển thị. VM chịu trách nhiệm chuyển đổi mô hình. Một khung nhìn chỉ nên yêu cầu máy ảo chuyển đổi mọi thứ trong mô hình dựa trên yêu cầu của người dùng. Quan điểm không có doanh nghiệp chuyển đổi bất cứ điều gì trong mô hình nó hoàn toàn là trách nhiệm của VM. Và VM tồn tại chính xác vì các mô hình không phù hợp trực tiếp với các khung nhìn làm việc (như datagridview). – NVM

0

Vì chưa bao giờ có câu trả lời được đánh dấu cho câu hỏi này; những gì bạn muốn là một sự kiện "thực hiện lệnh". Về cơ bản, nó nắm bắt một sự kiện mà bạn chọn và gọi thực hiện ICommand trên ViewModel của bạn.

Đã trả lời here tóm tắt (kiểm tra câu trả lời bằng Derek Beattie).

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