我试图将动态行为绑定到WPF逻辑树和可视树之外的可视元素。
我的问题是,在(准路径):RadChart.SeriesMapping.LineSeriesDefinition.Appearance.Stroke中给出了RadChart图的颜色。
我最初想将它绑定到XAML中图表数据文本的一个属性。天真地,我刚刚写了一个普通的{绑定PlotBrush}
编译器返回“找不到控制FrameWorkelement”错误。在阅读完之后,我认为这意味着解析层次结构上的数据文本不起作用。因为它的祖先(XAML )除了FrameWorkElement和其他关系之外还有其他类型,而不是内容控件的内容。至少,这是我目前对它的理解。请纠正我。
所以,我找到了"DataContext桥“http://www.codeproject.com/KB/WPF/AttachingVirtualBranches.aspx
简单地说,它是绑定,该框架元素的datacontext属性在运行时将数据文本(而不是继承它的任何数据文本)分配给资源中的FrameWorkElement实例的数据文本。然后使用相同的资源对象实例绑定到您希望“附加”到datacontext继承动态的“分支”的DataContext属性。但这篇文章的作者有幸能够实施观察到的财产的验证规则消费者。SolidColorBrush是密封的,我想要实现一个完整的刷子,甚至使用一个装饰器,这将是相当多的工作。
就我而言,这并不能帮助我做我想做的事,但我“太亲密了”。所以我想知道是否有什么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>“绑定”不是一个框架元素,"Source“也不是一个依赖属性,因此运行时当然会抱怨。我知道,Brush属性不会返回依赖属性注册中给出的默认值以外的任何内容。
在这个问题上,我第二天就要开始了。我认为我接下来的两次尝试是:*让ObservableBrush成为一个真正的刷子。然后以编程方式设置它(有效地使用标准的动态资源绑定)。我不喜欢这个。我想让数据库工作。*用电刷代替DATACONTEXT。
XAML部分工作正常:
<telerik:SeriesAppearanceSettings.Stroke>
<Binding Source="{StaticResource ResourceKey=StrokeBrush}" Path="Brush"/>
</telerik:SeriesAppearanceSettings.Stroke>但是,我如何将刷子绑定到DataContext属性?我是否可以在ObservableBrush中使用一些覆盖来动态地跟踪数据文本中的画笔?
如何在树中创建一个假的可视元素,然后将两个绑定关联到它?
<!-- Within the visual tree scope -->
<SomeFrameWorkElementType>
<SomeFrameWorkElemetType.SomeBrushProp>
<Binding Source="{StaticResource ResourceKey=StrokeBrush}" Path="Brush" Mode="OneWayToSource"/>
<Binding Stroke/>
</SomeFrameWorkElemetType.SomeBrushProp>
<SomeFrameWorkElementType>这将以某种方式“连接”这两个绑定?
或者,对于这类功能,是否有一些官方的“助手类”?
还是我找错了树,更好的办法是通过动态资源绑定在代码隐藏中解决这个问题?
对于如何继续这件事,有什么想法或看法吗?除了我明显的自毁性外,我坚持在动态资源应该解决这一问题时对其进行绑定。
发布于 2011-04-13 10:03:08
你在那里找到了乔希·史密斯的一篇好文章,但这篇文章有点过时。大约一年后,同一个人写了一篇更好的文章,涵盖了几乎相同的问题,但有更好的答案:人工继承语境
在那里,他使用了类DataContextSpy,尽管我仍然不完全理解您想要完成的任务,但我将尝试向您展示如何使用它:
<Grid><!-- this is some container where its DataContext has the PlotBrush Property-->
<Grid.Resources>
<spy:DataContextSpy x:Key="Spy"/>
</Grid.Resources>
<telerik:thisIsYourControl>
<telerik:SeriesAppearanceSettings.Stroke>
<Binding Source="{StaticResource Spy}" Path="DataContext.PlotBrush"/>
</telerik:SeriesAppearanceSettings.Stroke>
</telerik:thisIsYourControl>
<Grid>我希望这对你有帮助,也对你有用。我以前没有使用过telerik控件,这就是为什么我不能编写完整的示例,仍然希望这包括在内。
https://stackoverflow.com/questions/5647055
复制相似问题