2010-04-18 8 views
5

vì vậy trong các ví dụ MVVM cổ điển, tôi đã thấy định nghĩa DataTemplate được sử dụng để lập bản đồ Xem mô hình để xem, cách tiêu chuẩn để thực hiện điều này trong khung MVVM Light là gì, và các bản đồ nên được đặt ở đâu? Sau đây là những ví dụ về những gì tôi đang làm bây giờ và những gì tôi đang nói về, sự pha trộn rất quan trọng đối với tôi!Quy ước chuẩn để xác định chế độ xem lồng nhau là gì: ánh xạ viewmodel trong MVVM Light

Main Window:

<Window xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
     xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
     mc:Ignorable="d" 
     x:Class="STS2Editor.MainWindow" 
     Title="{Binding ApplicationTitle, Mode=OneWay}" 
     DataContext="{Binding RootViewModel, Source={StaticResource Locator}}"> 
    <Window.Resources> 
     <ResourceDictionary> 
      <ResourceDictionary.MergedDictionaries> 
       <ResourceDictionary Source="Skins/ApplicationSkin.xaml" /> 
       <ResourceDictionary Source="Resources/ViewMappings.xaml" /> 
      </ResourceDictionary.MergedDictionaries> 
     </ResourceDictionary> 
    </Window.Resources> 
    <Grid> 
     <ContentControl Content="{Binding ApplicationManagementViewModel}" HorizontalAlignment="Left" VerticalAlignment="Top"/> 
    </Grid> 
</Window> 

Trong đoạn mã trên, lớp RootViewModel tôi có một thể hiện của lớp ApplicationManagementViewModel với tên thuộc tính giống nhau:

public ApplicationManagementViewModel ApplicationManagementViewModel {get {...} set {...} } 

tôi tham khảo các ResourceDictionary "ViewMappings.xaml "để chỉ định cách hiển thị mô hình xem của tôi dưới dạng chế độ xem.

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
        xmlns:local="clr-namespace:STS2Editor.ViewModel"> 
    <DataTemplate DataType="{x:Type local:ApplicationManagementViewModel}"> 
     <local:ApplicationManagementView/> 
    </DataTemplate> 
</ResourceDictionary> 

Tôi có nên làm những việc như thế này bằng cách sử dụng ViewModelLocator không? những gì về các bộ sưu tập của các mô hình xem?

+0

Tôi nhận thấy một trong những vấn đề lớn với MVVM là LACK của một phương pháp thống nhất. – Firoso

+0

Tôi không nghĩ đó là vấn đề của MVVM. Đó là một mô hình, với nhiều triển khai. Cùng với MVC hoặc những người khác. Tôi không coi nó là một vấn đề, nó thực sự phụ thuộc vào tình hình và vấn đề bạn đang cố gắng giải quyết. – LBugnion

+0

Tôi có những câu hỏi rất giống nhau. Vậy DataTemplates có đủ tốt cho WPF không? Tôi muốn một loại vùng Prism, nhưng không có Prism. – nportelli

Trả lời

4

Phương pháp bạn sử dụng (với kiểu nhập dữ liệu ngầm) hoạt động OK trong WPF, nhưng tiếc là nó không hoạt động trong Silverlight. Đây là một trong những lý do tại sao tôi thích sử dụng một phương pháp rõ ràng hơn hoạt động trong cả hai thế giới.

Ngoài ra, DataTemplates được nhập ngầm có thể hơi khó hiểu một chút, vì không phải lúc nào cũng rõ ràng nơi mẫu đến từ đó. Điều đó có thể khiến công việc của nhà tích hợp rất khó khăn vào những thời điểm, đặc biệt là đối với những thay đổi nhỏ đối với giao diện người dùng (đã có, thực hiện điều đó :)

Không có nghĩa vụ sử dụng ViewModelLocator trong MVVM Light, nó chỉ là cách hoạt động tốt và khá dễ hiểu (đối với những người đọc mã không quen thuộc với sự tinh tế của WPF/SL). Cuối cùng, nó là rất nhiều vấn đề ưu tiên, nhưng gần đây mô hình ViewModelLocator dường như được phổ biến (xem ví dụ bài đăng này, nơi một ViewModelLocator chung được sử dụng cùng với MEF).

http://www.johnpapa.net/simple-viewmodel-locator-for-mvvm-the-patients-have-left-the-asylum/

Cuối cùng, hãy để tôi thêm rằng tôi không phải là rất hài lòng với việc thực hiện hiện hành của ViewModelLocator trong MVVM Light, và tôi muốn đề xuất một giải pháp nhiều generic ở những phiên bản tiếp theo.

+0

liên kết bị hỏng – vidstige