2012-03-04 12 views
10

Tôi đang cố gắng tìm ra cách tốt nhất để ghép nối Chế độ xem và Chế độ xem trong MVVM và tôi đã giải quyết phương pháp đầu tiên của ViewModel bằng cách sử dụng nhập DataTemplates, như được mô tả trong this article và trong this answer. Tôi đang sử dụng Prism và có nhiều mô-đun có thư viện dự án/lớp học của riêng họ.Tôi nên xác định bảng dữ liệu của mình ở đâu?

Câu hỏi của tôi là: DataTemplates của tôi nên nằm trong giải pháp của tôi ở đâu?

  1. Tôi có nên đặt DataTemplates trong từ điển tài nguyên trong cùng một dự án có loại/Chế độ xem mà nó hiển thị không?
  2. Tôi có nên đặt DataTemplates trong từ điển tài nguyên có trong dự án có MainWindow của ứng dụng (ví dụ: Shell.xaml) không?
  3. Những Từ điển tài nguyên này sau đó có được thêm vào App.Current.MainWindow.Resources.MergedDictionaries không?

Tôi hy vọng đây là đủ thông tin để mô tả những gì tôi đang cố gắng làm.

Cập nhật: xem nhận xét của câu trả lời đã chọn.

Trả lời

2

Tôi chắc chắn rằng cách tốt nhất ở đây là sử dụng tệp tài nguyên của Chủ đề \ Generic.xaml. Đây là tập tin (nó phải được chính xác trong thư mục Themes và có tên chính xác Generic.xaml) được sử dụng bởi WPF/Silverlight chủ đề động cơ và chứa các tài nguyên được chia sẻ thông qua toàn bộ ứng dụng. Bạn cũng có thể tạo tệp riêng trong thư mục Chủ đề có tên như Generic.DataTemplates.xaml và thêm liên kết vào tệp đó từ Generic.xaml. Google biết rất nhiều về generic.xaml hoặc bạn có thể xem thêm chi tiết trong câu trả lời của tôi tại đây: WPF Prism - Where to put Resources?

+0

Hey, cảm ơn cho đề xuất của bạn. Tôi đã đọc bài viết đó một thời gian trước và tôi sử dụng phương pháp Rachel mô tả ở đó. Tôi có một dự án cơ sở hạ tầng với một thư mục Themes, nơi tôi lưu trữ các kiểu của tôi trong 'Từ điển tài nguyên'. Vấn đề là dự án cơ sở hạ tầng này được tham chiếu bởi tất cả các dự án/mô-đun khác của tôi. Để sử dụng 'DataTemplates' đã nhập, tôi sẽ yêu cầu tham chiếu đến các dự án có chứa các ViewModels của tôi, điều đó có nghĩa là tạo ra một phụ thuộc vòng tròn. Tôi có nên tạo một dự án riêng để chỉ giữ 'DataTemplates' không? –

+1

Tôi nghĩ bạn có thể tạo chủ đề thư mục chỉ trong hội đồng mô-đun của bạn. Tôi làm theo cách này trong dự án hiện tại - Tôi đã chia sẻ các mẫu trong hội đồng giao diện người dùng riêng biệt và gần như mỗi mô-đun lắp ráp có thư mục Chủ đề riêng của nó – chopikadze

+0

Ok, điều đó nghe có vẻ giống như con đường để đi! Cảm ơn, tôi đánh giá cao lời khuyên của bạn. Tôi sẽ xem nếu tôi có thể làm cho nó hoạt động. –

2

Được cập nhật để giải thích rõ ràng hơn.

Tôi sẽ nói nếu DataTemplate của bạn là chung: nghĩa là bạn có UserControl liên kết với ViewModel và ViewModel đó có BaseViewModel, hiển thị một số loại thuộc tính. DataTemplate của bạn đang hiển thị các thuộc tính đó. Vì vậy, bạn có thể sử dụng DataTemplate này trên mỗi ViewModel để thực hiện BaseViewModel.

Tốt hơn là đặt nó trong App.xaml, vì vậy bạn có thể kéo nó ra bằng Khóa và áp dụng vào vị trí khác trong dự án của bạn.

Nhưng nếu DataTemplate của bạn là rất cụ thể,

tức Có một UserControl mà chỉ ràng buộc về tài sản quy định tại ViewModel đó và bạn biết không kiểm soát khác sẽ liên kết với ViewModel đó, bạn sẽ muốn đưa vào cùng một tệp Xaml Resources hoặc nơi bạn xác định UserControl của mình.

+0

Tôi hiểu rằng tôi có thể sử dụng 'DataTemplates' để tùy chỉnh hiển thị dữ liệu trong nói,' ListBox' và tôi có thể sử dụng lại 'DataTemplate' này và áp dụng nó cho' ListBoxes' bằng cách tham chiếu đến 'x: Key'. Nhưng theo bài viết của Josh Smith (xem ở trên), tôi tin rằng tôi cũng có thể sử dụng ** gõ ** 'DataTemplates' để ghép một View/UserControl thành' ViewModel'. I E. nếu tôi thêm một đối tượng ViewModel vào một 'ListBox', WPF sẽ trả về ViewModel bằng cách sử dụng UserControl được chỉ định trong' DataTemplate' (thay vì sử dụng ToString()). Tôi có cách nào ở đây không? –

+0

@Angavar Có, bạn cũng có thể sử dụng DataTemplate đã nhập để áp dụng nó. Tôi chỉ đưa ra một ví dụ như cách bạn có thể sử dụng x: Key của họ kéo ra các mẫu, Phong cách vv –

0

Theo Microsofts App Studio, DataTemplates phải nằm trong Thư mục con DataTemplates trong Thư mục Views. Một ứng dụng toàn cầu có thư mục này cho cả giao diện người dùng Windows giống như giao diện người dùng Windows Phone, vì vậy nó không nằm trong dự án được chia sẻ bởi vì chúng không giống nhau. Không sử dụng kiến ​​trúc PRISM Converge. Thiết kế hoàn toàn sai của nó! Điều đó không được viết bằng kiến ​​trúc Windows và Windows Phone nhưng cũng giống như họ gọi nó là Converged. Nó cần phải được thiết kế lại hoàn toàn giống như nó hoạt động trong Microsofts App Studio. Đừng tìm Dependency Injection không có trong nó và không cần thiết. Hầu hết sử dụng Dependency Injection cho các giao diện giả hoặc sơ khai. DataContext cho dữ liệu thiết kế hoạt động bây giờ rất tốt với dữ liệu json mà một thành phần Dependency Injection sẽ là quá mức cần thiết.