我正在使用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。
答案 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;
}
}