2009-05-09 16 views
24

MEF'ye bir genişletilebilirlik çerçevesi olarak bakıyordum ve bir nokta hariç, hemen hemen satıldım:WPF DataTemplate'i içe aktarmak için MEF'yi kullanma?

Bir ViewModel ve bir Görüntüle'yi görüntülemek için her ikisini de içe aktarmak istiyorum. Ben bunu yapmak için "doğru" yolu bir ViewModel sınıfı ve ViewModel görüntüleyen bir DataTemplate için MEF bölümü için olduğunu düşünüyorum. Örnek olarak, Visio benzeri bir uygulama oluşturduğunuzu ve bir şekil kitaplığı içe aktarmak istediğinizi varsayalım. Her bir şeklin, Xaml'de tanımlanmış bir Görünüm ve altta yatan bazı Model nesnesini saracak bir ViewModel'e ihtiyacı vardır.

Bu mümkün mü? Alma sözleşmesi DataTemplate için neye benziyordu ve WPF'yi içe aktarılan DataTemplate'den nasıl haberdar edebilirim?

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

Sonra kompozit kısmında, bir ViewModel ilan: my ev sahibi WPF uygulamasında

, bu İçe ekledi:

cevap

39

Evet, şu şekilde bu işi yapmak başardı ve düzenli bir ResourceDictionary Xaml dosyasında ViewModel için bir veri şablonu.

Başvuru için
[Export("ApplicationResources", typeof(ResourceDictionary))] 
public partial class ItemView : ResourceDictionary 
{ 
    public ItemView() 
    { 
     InitializeComponent(); 
    } 
} 

, Xaml örneğin ResourceDictionary şuna benzer: Sonra (bu örnekte, ViewModel ItemViewModel denir ve ResourceDictionary ItemView denir) bu gibi ResourceDictionary için arkasında bir kod oluşturuldu: sonra

<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> 

, geri konak WPF uygulamasında, başarıyla oluşturmak ve ana penceresini göstermeden önce, bunu sonra:

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

Bu WPF bir ItemViewModel gördüğü her yerde DataTemplate başarıyla uygulanmış görünüyor.

DÜZENLEME: ilgilenen herkes için, ben SoapBox Core olarak açık kaynak denilen bir uygulama çerçevesi yayınlandı ve uygulama kaynaklarının içine Görüntüleme ithal etmek yaygın bu yöntemi kullanır. Çok iyi çalışıyor ve kaynağı kendiniz indirebilir ve nasıl çalıştığına bakabilirsiniz.

+0

Bu kesin yaklaşımı denedim ancak ResourceDictionary yükleme zamanında boş. Başlatma zorlamak için bir yolu var mı yoksa yanlış bir şey mi yapıyorum? –

İlgili konular