2010-07-15 46 views
13

Tôi có Chế độ xem hiển thị một số DataGrid được gắn với một ObservableCollection trong Chế độ xem. Vì mục đích thảo luận, giả sử chúng ta có Chế độ xem Team chứa một Đội DataGrid, trong đó mỗi hàng đại diện cho một Player.Nhiều Chế độ xem được liên kết với một chế độ xem

Câu hỏi của tôi là về loại dữ liệu nào tôi nên sử dụng để đại diện cho người chơi trong bộ sưu tập Team của tôi. Ý tưởng tốt cho các mục trong bộ sưu tập có phải là ViewModels không? Trong trường hợp này, chế độ xem Team của tôi sẽ được liên kết với một ViewModel Team đơn lẻ cũng như bất kỳ số nào của Player Chế độ xem (trong bộ sưu tập Nhóm).

Có nhiều Chế độ xem được liên kết với một Chế độ xem vi phạm bất kỳ nguyên tắc thiết kế nào cho MVVM hay không và có cách nào ưu tiên triển khai kịch bản này không?

Cảm ơn!

Trả lời

28

Không có gì là tốt; mỗi đối tượng phải là một ViewModel theo đúng nghĩa của nó. Nó làm cho mã sạch hơn, tương tác đẹp hơn, và nhớ, nếu nó hoạt động tốt thì nó đúng (ngay cả khi nó vi phạm các nguyên tắc).

Tôi sẽ làm chính xác cách bạn đang kê đơn. Tôi muốn liên kết lưới của mình với một số Team, có một số ObservableCollection<Player>, trong đó Player là một loại lớp ViewModel khác. Mỗi mục hàng sẽ nhận được Player làm DataContext và do đó bạn vẫn ràng buộc với các thuộc tính ViewModel như bạn mong đợi: và Player vẫn có thể có public thuộc tính cho ICommand s (có thể là RelayCommands) để thao tác!

Hy vọng điều đó sẽ hữu ích!

+5

+1 cho "nếu hoạt động tốt thì đúng (ngay cả khi vi phạm nguyên tắc)" – andyp

+0

Không đùa. 1 từ tôi nữa. –

+1

Tôi nhận được một lol từ "nếu nó hoạt động đúng", nhưng tôi đã nhìn thấy rất nhiều thứ mà làm việc và cho đến nay từ chính xác họ làm cho tôi muốn ném. :) – CindyH

9

Cách xa các nguyên tắc vi phạm, tôi nghĩ đây là thiết kế được đề xuất. Ít nhất trong các dự án của tôi, bạn sẽ thấy mẫu này liên tục.

Mẫu này đặc biệt hữu ích khi kết hợp với DataTemplates. Ví dụ, bạn có thể định nghĩa một DataTemplate trong Application.Resources của bạn cho PlayerViewModel bạn như vậy:

<DataTemplate DataType="viewModels:PlayerViewModel"> 
    <StackPanel Orientation="Vertical"> 
     <Image Source="/Images/Player.png"/> 
     <TextBlock Text="{Binding Name}"/> 
    </StackPanel> 
</DataTemplate> 

Và sau đó nếu bạn muốn hiển thị một danh sách các cầu thủ bạn chỉ cần gắn một ListBox vv để TeamViewModel.Players ObservableCollection của bạn và bạn tự động nhận được DataTemplate ở trên hiển thị cho mỗi người chơi:

<ListBox ItemsSource="{Binding Players}"/> 
2

tôi đồng ý với tất cả các câu trả lời khác (những người bởi Kieren và Groky) nhưng cảm thấy họ không đề cập đến việc xem xét rất quan trọng trong quyết định này.

Bạn chỉ nên tạo mô hình xem nếu có điều gì đó cụ thể về chế độ xem của những gì bạn đang làm. Nếu tất cả những gì bạn đang làm là ràng buộc với dữ liệu và gọi các lệnh tự nhiên thuộc về mô hình của bạn, không có lý do gì để tạo ra một mô hình khung nhìn.

Ví dụ, giả sử:

  1. đối tượng Player của bạn có một tài sản Name, một tài sản Rank, phương pháp thúc đẩy() một, và một phương pháp Delete().
  2. Chế độ xem của bạn là một chế độ đơn giản cho phép bạn chỉnh sửa Tên và Xếp hạng của bất kỳ trình phát nào và cũng có các nút để quảng bá và xóa người chơi.

Trong trường hợp này, việc thêm mô hình xem giữa chế độ xem và mô hình của bạn là vô nghĩa. một cái nhìn như vậy có thể gắn trực tiếp vào mô hình:

  • Bind TextBox.Text đến thuộc tính Name
  • Bind Slider.Value đến tài sản Rank
  • Bind nút Đẩy mạnh các phương pháp thúc đẩy()
  • Liên kết nút Xóa với phương thức Xóa()

Lưu ý rằng thay vì ràng buộc nút Xóa thành phương thức Delete() bạn có thể đặt Command thành ApplicationCommands.Delete và sử dụng CommandBinding để gọi Phương thức Delete().

Điểm của tôi ở đây là trong hầu hết các trường hợp, nếu mô hình của bạn được thiết kế tốt, sẽ không cần phải chèn đối tượng kiểu xem. Mô hình khung nhìn chỉ thực sự cần thiết khi trạng thái xem cụ thể cần được theo dõi (như "Trình phát hiện tại"), chuyển đổi quá phức tạp để được xử lý bằng ràng buộc đơn giản hoặc bạn cần các lệnh ảnh hưởng đến nhiều đối tượng mô hình khác nhau và/hoặc chế độ xem các thuộc tính mô hình cùng một lúc. Theo kinh nghiệm của tôi, nếu mô hình được thiết kế chính xác thì chỉ có khoảng 50% so với tất cả các lượt xem thực sự cần một mô hình xem và trong trường hợp các mục trong một danh sách thì nó giống với 20%.

Ví dụ về thời điểm bạn có thể sử dụng mô hình chế độ xem cho một mục trong danh sách là khi bạn cần gắn cờ "được chọn" riêng biệt, một phần của chế độ xem chứ không phải của mô hình của bạn và chức năng cơ bản trong ListBox không đủ.

+0

Trích dẫn: "Chế độ xem như vậy có thể liên kết trực tiếp với mô hình: Ràng buộc TextBox.Text vào thuộc tính Tên Bind Slider.Về thuộc tính Xếp hạng Liên kết nút Quảng bá với phương thức Promote()" Kể từ khi nào Mô hình có phương pháp? Liên kết nút Xóa với phương thức Delete() – Elisabeth

+0

Hầu như tất cả các mô hình đều có phương thức. Một mô hình không có phương pháp sẽ giống như một người không có cơ bắp. Nếu không có phương pháp, làm thế nào bạn sẽ nói với mô hình để làm bất cứ điều gì? Bạn sẽ thay thế 'person.Clap()' bằng 'person.Clap = true' hoặc' PersonOperations.Clap (person) '? Một trong hai điều này có vẻ khó xử nhất. Trước khi lập trình hướng đối tượng có lập trình có cấu trúc, trong đó bạn có thể tạo ra một hàm 'PersonClap (Person * person)', nhưng IMHO hướng đối tượng để thể hiện mọi thứ rõ ràng hơn nhiều. –

+0

Tình huống duy nhất mà một đối tượng mô hình sẽ không có phương pháp là nếu nó không bao giờ có thể * làm * bất cứ điều gì nhưng chỉ là một bản ghi dữ liệu thô. Những vật thể này khá hiếm trong các ứng dụng thực tế. Các ví dụ có thể có thể là một điểm dữ liệu thô nhận được từ bộ chuyển đổi hoặc một mục nhập thư mục, nhưng thậm chí chúng có thể có phương thức Delete(). –

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