gpt4 book ai didi

WPF 绑定(bind)到可视树中某处的附加属性

转载 作者:行者123 更新时间:2023-12-04 16:13:06 25 4
gpt4 key购买 nike

我有一个附属物ZoneBackground .这可以在任何框架元素上注明。

我现在有风格ZonedTextBox .这应该应用 ZoneBackground 的值到一个文本框。线索是:风格不知道在视觉层次中的哪个位置ZoneBackground注明和在哪个元素上。

是否可以搜索具有 ZoneBackground 值的第一个父级?并使用该值?

我得到了这个 XAML:

<Grid controls:ZoneStylingBehavior.ZoneBackground="Red">
...
<TextBox Background="{Binding controls:ZoneStylingBehavior.ZoneBackground, RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=Grid}}" />
...
</Grid>

这不起作用,我更希望能够注意到 ZoneBackground可视树中的任何位置,例如 StackPanel , Grid并且可能多次。

更新 :正如建议的那样,我尝试使用 dp 继承。这个想法听起来不错,但我还没有成功。

DP声明:
public static readonly DependencyProperty ZoneBackgroundProperty = DependencyProperty.RegisterAttached("ZoneBackground", typeof(Brush), typeof(ZoneStylingBehavior), new FrameworkPropertyMetadata(null, FrameworkPropertyMetadataOptions.Inherits));

XAML:
<StackPanel>
<Grid controls:ZoneStylingBehavior.ZoneBackground="{StaticResource BrushGreen}">
...
<Label Background="{Binding controls:ZoneStylingBehavior.ZoneBackground, RelativeSource={RelativeSource Self}, PresentationTraceSources.TraceLevel=High}" Content="test" />
...
</Grid>
...
<Grid controls:ZoneStylingBehavior.ZoneBackground="{StaticResource BrushRed}">
...
</Grid>
</StackPanel>

控制台输出:
System.Windows.Data Error: 40 : BindingExpression path error: 'controls:ZoneStylingBehavior' property not found on 'object' ''TextBox' (Name='')'. BindingExpression:Path=controls:ZoneStylingBehavior.ZoneBackground; DataItem='TextBox' (Name=''); target element is 'TextBox' (Name=''); target property is 'Text' (type 'String')

级别 High 上的绑定(bind)跟踪显示:
System.Windows.Data Warning: 56 : Created BindingExpression (hash=17086942) for Binding (hash=33055417)
System.Windows.Data Warning: 58 : Path: 'controls:ZoneStylingBehavior.ZoneBackground'
System.Windows.Data Warning: 60 : BindingExpression (hash=17086942): Default mode resolved to OneWay
System.Windows.Data Warning: 61 : BindingExpression (hash=17086942): Default update trigger resolved to PropertyChanged
System.Windows.Data Warning: 62 : BindingExpression (hash=17086942): Attach to System.Windows.Controls.Label.Background (hash=18524697)
System.Windows.Data Warning: 67 : BindingExpression (hash=17086942): Resolving source
System.Windows.Data Warning: 70 : BindingExpression (hash=17086942): Found data context element: <null> (OK)
System.Windows.Data Warning: 72 : RelativeSource.Self found Label (hash=18524697)
System.Windows.Data Warning: 78 : BindingExpression (hash=17086942): Activate with root item Label (hash=18524697)
System.Windows.Data Warning: 108 : BindingExpression (hash=17086942): At level 0 - for Label.controls:ZoneStylingBehavior found accessor <null>
System.Windows.Data Error: 40 : BindingExpression path error: 'controls:ZoneStylingBehavior' property not found on 'object' ''Label' (Name='')'. BindingExpression:Path=controls:ZoneStylingBehavior.ZoneBackground; DataItem='Label' (Name=''); target element is 'Label' (Name=''); target property is 'Background' (type 'Brush')
System.Windows.Data Warning: 103 : BindingExpression (hash=17086942): Replace item at level 1 with {NullDataItem}
System.Windows.Data Warning: 80 : BindingExpression (hash=17086942): TransferValue - got raw value {DependencyProperty.UnsetValue}
System.Windows.Data Warning: 88 : BindingExpression (hash=17086942): TransferValue - using fallback/default value <null>
System.Windows.Data Warning: 89 : BindingExpression (hash=17086942): TransferValue - using final value <null>

有人可以指出什么问题吗?

最佳答案

不要在设置此值的可视树中搜索第一个父级,而是将附加属性设置为 inherit by default 通过设置 FrameworkPropertyMetadataOptions.Inherits 注册时附加属性的标志。

样本:

public static readonly DependencyProperty ZoneBackgroundProperty =
DependencyProperty.RegisterAttached("ZoneBackground",
typeof(Brush), typeof(ZoneStylingBehavior),
new FrameworkPropertyMetadata(FrameworkPropertyMetadataOptions.Inherits));

因此,通过这种方式,它将自动从 Visual 树中的第一个父级继承值,并为附加属性设置值。 (DataContext DP也是这样工作的)

更新 :

对于附加的属性绑定(bind),您需要将绑定(bind)包装在括号中。
<Label Background="{Binding (controls:ZoneStylingBehavior.ZoneBackground), 
RelativeSource={RelativeSource Self}}"
Content="test"/>

关于WPF 绑定(bind)到可视树中某处的附加属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24976557/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com