2014-02-12 22 views
1

我想開發一個MEF插件軟件,以記事本++爲例,每個選項卡將顯示從每個插件導入的視圖。以mvvm方式從MEF插件獲得多個相同的視圖

以下接口將提供MEF組合後的ConfigView的一個實例。 但如何創建ConfigView的多個實例?

public interface IPluginA:IPlugin { 
    // View, user control 
    FrameworkElement CongfigView { get; } 
} 

--------可能的解決方法--------------------------------- -----------------------------------

其實我試圖在AvalonDock中使用它,並發現avalonDock需要dataTemplate來創建多個 視圖。這樣,插件只需要提供一個視圖數據模板。

internal class PanesTemplateSelector : DataTemplateSelector { 


    private DataTemplate _fileViewTemplate; 
    public DataTemplate FileViewTemplate { 
     get { 
      return _fileViewTemplate; 
     } 
     set { _fileViewTemplate = value; } 
    } 

    public DataTemplate FileStatsViewTemplate { 
     get; 
     set; 
    } 


    public PanesTemplateSelector() { 
     // convert from usercontrol to data template 
     FrameworkElementFactory factory = new FrameworkElementFactory(typeof(FileView)); 
     DataTemplate dt = new DataTemplate(); 
     dt.VisualTree = factory; 

     _fileViewTemplate = dt; 
    } 

    public override System.Windows.DataTemplate SelectTemplate(object item, System.Windows.DependencyObject container) { 

     var itemAsLayoutContent = item as LayoutContent; 

     if (item is FileViewModel) 
      return FileViewTemplate; 

     if (item is FileStatsViewModel) 
      return FileStatsViewTemplate; 

     return base.SelectTemplate(item, container); 
    } 
} 

感謝

+0

不清楚你所問的,請編輯 –

+0

這是否清楚?謝謝 – Joish

+0

你可以保留一些意見,而不是一個? FrameworkElement CongfigView [] {get; }? –

回答

1

只要保持多個視圖,而不是一個......你可以把列表或FrameworkElement的[]基於您是否要動態地或不建立新的

public interface IPluginA:IPlugin { 
    // View, user control 
    IList<FrameworkElement> CongfigViews { get; } 
} 
+0

還有一個問題,如何要求插件添加一個新的configView?在界面中使用另一種方法(AddNewConfigView)? – Joish

+0

你可以調用ConfigView.Add,但使用方法肯定會更好。不僅僅是創建IEnumerable 類型的ConfigView,並且使用基礎的ObservableCollection,它將能夠刷新新vew add的主視圖 –