2014-02-15 27 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; 
    } 
}