我正在尝试将动态行为绑定到WPF逻辑和视觉树之外的可视元素。我的问题是,RadChart绘图颜色在(quasi path)中给出:
RadChart.SeriesMapping.LineSeriesDefinition.Appearance.Stroke
我最初想将其绑定到XAML中图表数据上下文的属性。天真地,我只写了一个常规的{Binding PlotBrush}
编译器返回“找不到主要的FrameWorkelement”错误。阅读后,我认为这意味着无法解析层次结构中的数据上下文。因为它的祖先(XAML讲话)有其他类型而且与内容控件的内容不同。
至少,这是我目前的理解。请纠正我。
所以,我找到了“DataContext Bridge” http://www.codeproject.com/KB/WPF/AttachingVirtualBranches.aspx 简单来说,它表示您将运行时分配数据上下文的框架元素的数据上下文属性(而不是任何继承它的属性)与“资源内的FrameWorkElement实例”的数据上下文绑定。然后,使用相同的资源对象实例来绑定到您希望“附加”到DataContext继承动态的“分支”的DataContext属性。但文章的作者有幸能够实现观察属性的ValidationRule消费者。SolidColorBrush是密封的,我想即使使用装饰器实现完整的Brush也需要相当多的工作。
在我的情况下,这并不能帮助我做到我想要的,但我“非常接近”。因此,我想知道是否有一些XAML技巧可以帮助我。
所以,下一步是我是否可以直接获取刷子对象。我进行了一些实验,随意尝试了这种事情:
.cs:
XAML的顶部:
"Binding"不是一个框架元素,"Source"也不是一个依赖属性,因此运行时会报错。我知道Brush属性永远不会返回除了在依赖属性注册中给定的默认值以外的任何值。
我已经连续第二天在解决这个问题。我认为我的下一步尝试将是: * 将ObservableBrush变成实际的Brush。然后通过编程方式设置它(有效地使用标准动态资源绑定)。我不喜欢这样做。我想让数据绑定工作。 * 桥接一个BRUSH而不是DATACONTEXT。
XAML部分正常工作:
编译器返回“找不到主要的FrameWorkelement”错误。阅读后,我认为这意味着无法解析层次结构中的数据上下文。因为它的祖先(XAML讲话)有其他类型而且与内容控件的内容不同。
至少,这是我目前的理解。请纠正我。
所以,我找到了“DataContext Bridge” http://www.codeproject.com/KB/WPF/AttachingVirtualBranches.aspx 简单来说,它表示您将运行时分配数据上下文的框架元素的数据上下文属性(而不是任何继承它的属性)与“资源内的FrameWorkElement实例”的数据上下文绑定。然后,使用相同的资源对象实例来绑定到您希望“附加”到DataContext继承动态的“分支”的DataContext属性。但文章的作者有幸能够实现观察属性的ValidationRule消费者。SolidColorBrush是密封的,我想即使使用装饰器实现完整的Brush也需要相当多的工作。
在我的情况下,这并不能帮助我做到我想要的,但我“非常接近”。因此,我想知道是否有一些XAML技巧可以帮助我。
<Window.Resources>
<local:FrameWorkElement x:Key="DataContextBridge"/>
</Window.Resources>
然而,目前还不清楚我该如何利用它。没有任何对象其数据上下文应该被设置。AppearanceSettings 不是一个 FrameworkElement。
<telerik:SeriesAppearanceSettings>
<telerik:SeriesAppearanceSettings.Stroke>
Ok, how do I use the fact that I can access the datacontext here?
</telerik:SeriesAppearanceSettings.Stroke>
</telerik:SeriesAppearanceSettings>
所以,下一步是我是否可以直接获取刷子对象。我进行了一些实验,随意尝试了这种事情:
.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的顶部:
<Window.Resources>
<local:ObservableBrush x:Key="StrokeBrush"/>
</Window.Resources>
内联XAML:
<telerik:SeriesAppearanceSettings.Stroke>
<Binding Path="Brush">
<Binding.Source>
<Binding Source="{StaticResource ResourceKey=StrokeBrush}" Path="DataContext"/>
</Binding.Source>
</Binding>
</telerik:SeriesAppearanceSettings.Stroke>
"Binding"不是一个框架元素,"Source"也不是一个依赖属性,因此运行时会报错。我知道Brush属性永远不会返回除了在依赖属性注册中给定的默认值以外的任何值。
我已经连续第二天在解决这个问题。我认为我的下一步尝试将是: * 将ObservableBrush变成实际的Brush。然后通过编程方式设置它(有效地使用标准动态资源绑定)。我不喜欢这样做。我想让数据绑定工作。 * 桥接一个BRUSH而不是DATACONTEXT。
XAML部分正常工作:
<telerik:SeriesAppearanceSettings.Stroke>
<Binding Source="{StaticResource ResourceKey=StrokeBrush}" Path="Brush"/>
</telerik:SeriesAppearanceSettings.Stroke>
但是,我该如何将Brush绑定到DataContext属性上呢?在ObservableBrush中有没有可以使用的重写方法,使得Brush可以动态地跟随数据上下文中的Brush?
那么在树形结构中创建一个虚拟的可视元素,然后将两个绑定关联到它上面怎么样?
<!-- Within the visual tree scope -->
<SomeFrameWorkElementType>
<SomeFrameWorkElemetType.SomeBrushProp>
<Binding Source="{StaticResource ResourceKey=StrokeBrush}" Path="Brush" Mode="OneWayToSource"/>
<Binding Stroke/>
</SomeFrameWorkElemetType.SomeBrushProp>
<SomeFrameWorkElementType>
这样会“连接”这两个绑定吗?
还是有一些(非)官方的“辅助类”来实现此类功能?
或者我是在错误的道路上,最好通过动态资源绑定在代码后台解决这个问题?
如何继续进行的任何想法或观察?除了我坚持数据绑定而动态资源应该解决这个问题之外。