2014-02-15 53 views
1

我使用AvalonDock和MEF插件架構, 每個插件都返回一個數據模板主機,主機獲取數據模板,插入到主數據模板。如何將多個數據模板插入到主日期模板

以下是在被轉換成的DataTemplates

用戶控件

MainMethodView:包括選項卡,

PluginA的MethodView:需要被插入到MainMethodView的標籤項1.

PluginB的MethodView:需要被插入到MainMethodView的標籤條目2中。

.....

謝謝。

代碼:InitializePlugins()我只有能顯示一個插件的DataTemplate中。和GetMethodViewTemplate()給我錯誤:ContentControl的內容必須是單個元素。

參考:Link1

public void InitializePlugins(){ 
var templateSelector = new PanesTemplateSelector(); 
    templateSelector.MethodViewTemplate = pluginService.Plugins[0].MethodViewTemplate; 
    _dockingManger.LayoutItemTemplateSelector = templateSelector; 
} 
private static DataTemplate GetMethodViewTemplate(PluginService pluginService) { 
    FrameworkElementFactory factory = new FrameworkElementFactory(typeof(MethodView)); 
    foreach (var plugin in pluginService.Plugins) { 
     FrameworkElementFactory fef = new FrameworkElementFactory(typeof(ContentControl)); 
     fef.SetValue(ContentControl.ContentTemplateProperty, plugin.MethodViewTemplate); 
     factory.AppendChild(fef); 
    } 
    DataTemplate dt = new DataTemplate(); 
    dt.VisualTree = factory; 
    return dt; 
} 

的另一個問題是數據綁定,MainMethodViewModel具有插件,如何將其綁定到MainMethodView PluginMethodViewModels。

回答

1

這是我找到的解決方案。分享每個人。 注意:View1和View2是usercontrol,綁定設置位於xaml文件中。

public MainWindow() { 
     InitializeComponent(); 
     CreateTemplate4(); 
    } 

    private void CreateTemplate4() { 
     var method = new MethodViewModel(); 
     FrameworkElementFactory fefWrapper = new FrameworkElementFactory(typeof(TabControl)); 

     foreach (var fred in method.Freds) { 
      DataTemplate dt1 = fred.Template; 
      FrameworkElementFactory fefTop = new FrameworkElementFactory(typeof(ContentControl)); 
      fefTop.SetValue(ContentControl.ContentTemplateProperty, dt1); 
      fefTop.SetValue(ContentControl.ContentProperty, fred); 
      fefWrapper.AppendChild(fefTop); 
     } 
     DataTemplate dtWrapper = new DataTemplate(typeof(MethodViewModel)); 
     dtWrapper.VisualTree = fefWrapper; 

     this.DataContext = method; 
     this.cc.ContentTemplate = dtWrapper; 

    } 
class MethodViewModel { 
    public ObservableCollection<Fred> Freds { get; set; } 
    public MethodViewModel() { 
     Freds = new ObservableCollection<Fred>(); 

     Freds.Add(new Fred1(1)); 
     Freds.Add(new Fred2(2)); 


    } 
} 

public class Fred { 
    public int X { get; set; } 
    public int y { get; set; } 
    public Fred(int x) { 
     this.X = x; 
     this.y = x + 1; 
    } 
    public DataTemplate Template { get; set; } 
} 
public class Fred1 : Fred { 
    public Fred1(int x) : base(x) { 
     FrameworkElementFactory factory = new FrameworkElementFactory(typeof(View1)); 
     DataTemplate dt = new DataTemplate(); 
     dt.VisualTree = factory; 
     this.Template = dt; 
    } 
} 
public class Fred2 : Fred { 
    public Fred2(int x) : base(x) { 
     FrameworkElementFactory factory = new FrameworkElementFactory(typeof(View2)); 
     DataTemplate dt = new DataTemplate(); 
     dt.VisualTree = factory; 
     this.Template = dt; 
    } 
}