如何将多个数据模板插入主日期模板

时间:2014-02-15 14:19:11

标签: wpf mef datatemplate

我正在使用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有来自插件的PluginMethodViewModels,它如何绑定到MainMethodView。

1 个答案:

答案 0 :(得分: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;
    }
}