2009-05-09 26 views
24

Tôi đã xem MEF như một khuôn khổ mở rộng và tôi bán khá nhiều, ngoại trừ một điểm:Sử dụng MEF để nhập một DataFemplate WPF?

Giả sử tôi muốn nhập cả ViewModel và Chế độ xem để hiển thị nó. Tôi nghĩ rằng "đúng" cách để làm điều đó là cho phần MEF để xuất khẩu một lớp ViewModel, và một DataTemplate hiển thị ViewModel. Ví dụ, giả sử bạn đang xây dựng một ứng dụng giống Visio và bạn muốn nhập một thư viện các hình dạng. Mỗi hình dạng cần một View được định nghĩa trong Xaml và một ViewModel sẽ bao bọc một số đối tượng Model cơ bản.

Điều này có khả thi không? Hợp đồng nhập khẩu trông như thế nào đối với DataTemplate và làm thế nào để WPF nhận thức được DataTemplate đã nhập?

Trả lời

39

Vâng, tôi đã có thể làm cho công việc này theo cách sau:

Trong máy chủ ứng dụng WPF của tôi, tôi đã thêm Import này:

[ImportMany("ApplicationResources", typeof(ResourceDictionary))] 
    public IEnumerable<ResourceDictionary> Views { get; set; } 

Sau đó, trong phần tổng hợp của tôi, tôi tuyên bố một ViewModel và một mẫu dữ liệu cho ViewModel trong một tệp ResourceDictionary Xaml thông thường. Sau đó, tôi tạo ra một mã số đằng sau cho ResourceDictionary, như thế này (trong ví dụ này, các ViewModel được gọi ItemViewModel và ResourceDictionary được gọi ItemView):

[Export("ApplicationResources", typeof(ResourceDictionary))] 
public partial class ItemView : ResourceDictionary 
{ 
    public ItemView() 
    { 
     InitializeComponent(); 
    } 
} 

Để tham khảo, các XAML ví dụ như ResourceDictionary trông như thế này:

<ResourceDictionary 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
    xmlns:local="clr-namespace:MyCompany.MyProduct" 
    x:Class="MyCompany.MyProduct.ItemView"> 

    <DataTemplate DataType="{x:Type local:ItemViewModel}"> 
     ... 
    </DataTemplate> 

</ResourceDictionary> 

sau đó, trở lại trong máy chủ ứng dụng WPF của tôi, sau khi tôi soạn thành công và trước khi tôi hiển thị cửa sổ chính, tôi làm điều này:

// Add the imported resource dictionaries 
// to the application resources 
foreach (ResourceDictionary r in Views) 
{ 
    this.Resources.MergedDictionaries.Add(r); 
} 

Điều đó dường như áp dụng thành công DataTemplate ở bất cứ đâu WPF thấy một ItemViewModel.

EDIT: Đối với bất kỳ ai quan tâm, tôi đã phát hành một khung ứng dụng được gọi là SoapBox Core làm nguồn mở và sử dụng rộng rãi phương pháp này để nhập Chế độ xem vào tài nguyên ứng dụng. Nó hoạt động rất tốt, và bạn có thể tự tải xuống nguồn và xem cách nó hoạt động.

+0

Tôi đã thử cách tiếp cận chính xác này nhưng ResourceDictionary trống khi tải. Có cách nào để bắt buộc hoặc tôi đang làm điều gì sai? –

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