2011-07-14 33 views
7

Tôi có một giao diện người dùng WPF khá cơ bản theo đó yêu cầu người dùng gây ra một tab mới để mở trong TabControl của tôi. TabControl là ràng buộc để một ObservableCollection<ViewModelBase>Câu hỏi về Quản lý ViewModel (DesignTime Vs Run Time)

tôi thêm trường hợp ViewModel vào bộ sưu tập này, và nội dung các tab tương ứng được hiển thị dựa trên các mẫu như thế này:

<DataTemplate DataType="{x:Type viewModels:UserUploadsViewModel}"> 
     <userControls:UserUploads /> 
    </DataTemplate> 

Bây giờ chúng ta hãy nói rằng bên trong UserUploads kiểm soát tôi muốn dây lên một máy ảo trong XAML để giúp đỡ với các thiết kế, như thế này:

<UserControl x:Class=".....UserUploads" 
    ..... 
    DataContext="{Binding Source={StaticResource ViewModelLocater}, 
        Path=UserAdministrationViewModel}"> 

thuộc tính này sẽ trả về một VM với các dịch vụ trực tiếp trong thời gian chạy, và một máy ảo với dữ liệu giả lúc thiết kế.

Câu hỏi: XAML này có can thiệp vào những gì tôi đang làm trong việc ràng buộc nội dung TabItems với cá thể ViewModel hay không và dựa vào dataTemplate ở trên để hiển thị Chế độ xem phù hợp? Nếu vậy, có cách nào để có được cả hai khái niệm này để làm việc cùng nhau?

Trả lời

22

Có một cách dễ dàng hơn để làm điều này. Có một DesignTimeUserAdministrationViewModel và cư nó với dữ liệu tĩnh trong các nhà xây dựng và giới thiệu rằng trong UserControl như:

<UserControl d:DataContext="{d:DesignInstance designTimeVMs:DesignTimeUserAdministrationViewModel, IsDesignTimeCreatable=True}"> 

Bằng cách này bạn có một thời gian thiết kế dữ liệu thử nghiệm chắc chắn sẽ d:DataContext và thời gian chạy dữ liệu trực tiếp ràng buộc với thực tế DataContext. Thêm chi tiết here.

+0

Điều đó có vẻ tuyệt vời. Vì vậy, nếu đó là thời gian thiết kế, đó (thiết kế mô hình xem thời gian) đối tượng sẽ được dây lên, nhưng lúc chạy nó sẽ không làm gì? –

+1

Có, nó được thêm vào cho sự pha trộn. – anivas

+0

Tuyệt vời! Sử dụng 'IsDesignTimeCreatable = True' sẽ điền vào khung nhìn với dữ liệu. Nếu được đặt thành 'False', nó sẽ chỉ cung cấp" hình dạng "của dữ liệu, cung cấp hỗ trợ ràng buộc dữ liệu đầy đủ trong nhà thiết kế, thay vì ràng buộc một cách mù quáng. Ngoài ra, bạn có thể sử dụng tệp .xaml để chỉ định đầy đủ dữ liệu mẫu với '{d: DesignData}'. Xem [Hướng dẫn: Sử dụng DesignInstance để Liên kết với Dữ liệu trong Nhà thiết kế] (http://msdn.microsoft.com/en-us/library/dd490796 (VS.100) .aspx) và [Hướng dẫn: Sử dụng Dữ liệu Mẫu trong WPF Designer] (http://msdn.microsoft.com/en-us/library/ee823176 (v = vs.100) .aspx) – cod3monk3y

1

Có, tôi nghĩ rằng nó sẽ gây trở ngại với việc thiết lập hiện tại của bạn

Các ViewModelLocator là một lớp tĩnh mà trả về một đối tượng giả lúc thiết kế, và một ViewModel tĩnh khi chạy. Điều này có nghĩa rằng

  • Các ViewModelLocator, không ParentViewModel của bạn, chứa TabViewModels bạn

  • Bạn không thể có nhiều trường hợp của các Tab cùng (ViewModel) mở cùng một lúc

  • Bạn không thể quản lý mở/Các tab đã đóng trừ khi bạn tham chiếu UserControl, vi phạm nguyên tắc MVVM trong đó ViewModel không biết về Chế độ xem

  • Bạn không thể khởi tạo bản sao mới của TabViewModel với các hàm tạo tham số. Ví dụ: OpenTabs.Add(new CustomerViewModel(CustomerId));

Có lẽ thay thế có thể là một Trình chuyển đổi? Một trong đó trả về một đối tượng tĩnh nếu trong thời gian thiết kế, hoặc đối tượng bị ràng buộc trong thời gian chạy? Tôi chưa bao giờ thử nghiệm một điều như vậy nhưng trong lý thuyết nó nên làm việc :)

1

Việc xây dựng trong MS thứ không phải là xấu, nhưng khác thay thế thanh lịch hơn và cấu trúc âm thanh mà tôi Incorporating bận rộn trong dự án của tôi là: http://msdn.microsoft.com/en-us/magazine/dn169081.aspx

Về cơ bản, bạn sử dụng bộ công cụ MVVM nhẹ với container SimpleIoc nó đi kèm và kết thúc với khả năng phân phát dữ liệu cho ba trường hợp sau:

Thời gian thiết kế, Thời gian chạy và Thời gian thử nghiệm.

Vẫn còn tốt hơn, toàn bộ điểm của MVVM Light là để nội dung của bạn có thể chỉnh sửa trực tiếp trong Blend và có một loạt video, blog và ứng dụng mẫu mô tả tất cả. Tôi ước gì tôi đã tìm thấy những điều này sớm hơn trong các cuộc khám phá WPF của tôi.