在Wpf中,如何在运行时修改DataTemplate?

问题描述 投票:0回答:1

我正在编写一个插件,该插件已加载到源不受我管理的应用程序中。通过 API,我可以获得应用程序的 AvalonDock

DockingManager
。我想添加一个绑定来控制选项卡的颜色。我知道
DataContext
的数据类型,并且可以创建
Binding
来执行我想要的操作。

但是,我希望与原始

DataTemplate
相关的其余绑定和触发器保持不变。我可以从
DataTemplate
获取
DockingManager
,但是一旦应用,它们就会被密封,所以我猜我需要克隆它,修改克隆并应用克隆。

我尝试使用

XamlWriter.Save()
获取模板,但是绑定被从中剥离。如果我在输出上使用
XamlReader.Parse()
,而不进行任何修改,选项卡的文本就会消失。查看xaml,
TextBlock.Text
属性是一个空字符串。

我认为应用程序“手动”设置文本,但使用 Visual Studio 检查控件显示在写入/读取过程之前存在绑定。

当模板的创建不受我的控制时,如何在运行时修改模板以添加自定义绑定?

wpf plugins data-binding datatemplate avalondock
1个回答
0
投票

虽然不完全是我问题的直接答案,但我想出的解决方案实际上是修改

Style
而不是
Template
。从
DockingManager
我得到了
LayoutDocumentPaneControl
以及我想要更改的选项卡。我得到了它的
ItemContainerStyle
,制作了一个新的
BasedOn
旧的,并且可以根据需要添加
Setters
,这样除了我试图专门覆盖的内容之外,一切都保持不变。

void OverwriteTabStyle()
{
    MultiBinding binding = CreateTabBinding(); //Create the binding to set the background color based on context
    var dockingManager = _dockingManagerProvider.GetDockingManager(); //Get access to the DockingManager
    var layoutDocumentPaneControl = dockingManager.FindVisualChildren<LayoutDocumentPaneControl>().FirstOrDefault();
    Style oldStyle = layoutDocumentPaneControl.ItemContainerStyle;
    Style newStyle = new Style(typeof(TabItem), oldStyle);
    newStyle.Setters.Add(new Setter(Panel.BackgroundProperty, binding)); //Only modifies single property while maintaining other Bindings
    newStyle.Seal();
    layoutDocumentPaneControl.ItemContainerStyle = newStyle;
}
© www.soinside.com 2019 - 2024. All rights reserved.