可视树外的数据绑定。 数据上下文桥接

我试图将动态行为绑定到WPF逻辑和可视树之外的可视元素。

我的问题是RadChart绘图颜色在(准路径)中给出:RadChart.SeriesMapping.LineSeriesDefinition.Appearance.Stroke

我原本想将它绑定到XAML中图表datacontext的属性。 天真的,我只是写了一个普通的{Binding PlotBrush}

编译器返回“无法找到Governing FrameWorkelement”错误。 在阅读之后,我认为这意味着在层次结构中解析datacontext不起作用。 因为它的祖先(XAML说话)具有除Fra​​meWorkElement之外的其他类型和其他关系,而不是内容控件的内容。 至少,这是我目前对它的理解。 请指正。

所以,我找到了“DataContext Bridge” http://www.codeproject.com/KB/WPF/AttachingVirtualBranches.aspx

简单来说,它表示您绑定了框架元素的datacontext属性,该元素在运行时将datacontext(不是任何inheritance它的那些)分配给资源中的FrameWorkElement实例的datacontext。 然后使用相同的资源对象实例绑定到您希望“附加”到DataContextinheritance动态的“分支”的datacontext属性。 但该文章的作者很幸运能够实现观察到的属性的validationrule消费者。 SolidColorBrush是密封的,我想即使使用装饰器也可以实现一个完整的画笔。

就我而言,这并没有帮助我做我想做的事,但我“非常接近”。 所以我想知道是否有某些方面的XAML技巧可以帮助我。

   

但是,目前还不清楚我是如何利用它的。 没有应该设置datacontext的对象。 AppearanceSettings不是FrameWorkElement。

   Ok, how do I use the fact that I can access the datacontext here?   

所以,下一步是我可以直接以某种方式获得画笔对象。 我尝试过这种事情,只是搞乱:

.cs:

 public class ObservableBrush : FrameworkElement { public Brush Brush { get { return (Brush) GetValue(BrushProperty); } set { SetValue(BrushProperty, value); } } public static readonly DependencyProperty BrushProperty = DependencyProperty.Register("Brush", typeof (Brush), typeof (ObservableBrush), new UIPropertyMetadata(new SolidColorBrush(Colors.Black))); } 

XAML的顶部:

    

内联XAML:

        

“绑定”不是一个frameworkelement,也不是“Source”也是一个依赖属性,所以运行时当然会抱怨。 我知道Brush属性不会返回除依赖项属性注册中给出的默认值以外的任何内容。

我有点在这个问题的第二天。 我认为接下来的两次尝试将是:*使ObservableBrush成为一个真正的画笔。 然后以编程方式设置它(有效地使用标准动态资源绑定)。 我不喜欢它。 我想做数据绑定工作。 *桥接BRUSH而不是DATACONTEXT。

XAML部分工作正常:

    

但同样,我如何将Brush绑定到DataContext属性? 我是否可以在ObservableBrush中使用一些覆盖来使Brush动态跟随datacontext中的一个?

如何在树中创建虚假的视觉元素,然后将两个绑定关联到它?

        

这会以某种方式“连接”两个绑定?

或者是否有一些(联合国)官方“助手类”用于此类function?

或者我咆哮错误的树,并且(更好)通过动态资源绑定在代码隐藏中更好地解决这个问题?

关于如何继续这样做的任何想法或观察? 除了在动态资源应该解决这个问题时坚持数据绑定的明显的自我破坏性。

你在约什史密斯找到了一篇好文章,但它有点过时了。 同一个人在一年之后写了一篇更好的文章,它涵盖了几乎相同的问题,但有更好的答案: 人工inheritance语境

在那里,他使用DataContextSpy类,虽然我仍然没有完全得到你想要完成的东西,但我会试着告诉你如何使用它:

           

我希望这对你有所帮助。 我之前没有使用过telerik控件,这就是我无法编写完整示例的原因,但仍希望能够涵盖它。