gpt4 book ai didi

c# - 具有附加属性的 ControlTemplate 中的命令绑定(bind)

转载 作者:太空宇宙 更新时间:2023-11-03 11:15:43 25 4
gpt4 key购买 nike

我正在尝试建立一个系统,允许我将字符串值附加到 ComboBoxItem 并将其显示在 ComboBoxItem 的内容旁边,而不必在每个单独的 ComboBoxItem 中显式嵌套 StackPanel 或使用自定义控件。

所以我所做的是创建一个名为“Header”的 DependencyProperty 并将其附加到 ComboBoxItem,并且我覆盖了 ComboBoxItem 模板以包含带有 TextBlock 的堆栈面板,该 TextBlock 将其 Text 绑定(bind)到附加的 Header 属性ComboBoxItem。

我遇到的问题是,在运行时出现在 TextBlock 中的唯一文本是我在元数据中将依赖属性的默认值设置为什么。此后对 ComboBoxItems 上附加属性的任何更改都不会反射(reflect)在 TextBlock 中。

这是我的 DependencyProperty 定义:

public class AttHeader : DependencyObject
{
public static readonly DependencyProperty HeaderProperty = DependencyProperty.RegisterAttached("Header", typeof(string), typeof(AttHeader));

public static void SetHeader(DependencyObject d, string value)
{
d.SetValue(HeaderProperty, value);
}

public static string GetHeader(DependencyObject d)
{
return (string)d.GetValue(HeaderProperty);
}
}

这是我的风格和模板:

<Style TargetType="ComboBoxItem">
<Setter Property="OverridesDefaultStyle" Value="True"/>
<Setter Property="SnapsToDevicePixels" Value="True"/>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="ComboBoxItem">
<StackPanel Orientation="Horizontal">
<ContentPresenter />
<TextBlock Name="HeaderHost" Text="{Binding Path=(local:AttHeader.Header), RelativeSource={RelativeSource Self}}" />
</StackPanel>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>

这里是我创建一些 ComboBoxItems 的地方:

<ComboBox SelectedIndex="0">
<ComboBoxItem local:AttHeader.Header="Isometric">
<Image Source="../images/viewTypeIso.png" Stretch="None"/>
</ComboBoxItem>
<ComboBoxItem local:AttHeader.Header="Top">
<Image Source="../images/ViewTypeTop.png" Stretch="None"/>
</ComboBoxItem>
</ComboBox>

即使在创建这些 ComboBoxItem 时设置附加属性的值也不会影响其中的 TextBlocks。

我假设绑定(bind)是有效的,因为我可以为依赖属性设置默认值,并且每个 ComboBoxItem 将始终在其图像旁边显示该值。

我在 SetHeader 中设置了一个断点,它确实在构造那些 ComboBoxItems 时被调用。

我是否做错了什么,或者是否有一些我不知道的 Binding 限制?

最佳答案

您的绑定(bind)不正确,TextBlock 现在是 ComboBoxItem 的子项尝试绑定(bind)到:

 <Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="ComboBoxItem">
<StackPanel Orientation="Horizontal">
<ContentPresenter />
<TextBlock Name="HeaderHost"
Text="{Binding Path=local:AttHeader.Header,
RelativeSource={RelativeSource Mode=FindAncestor
,AncestorType=ComboBoxItem}}" />
</StackPanel>
</ControlTemplate>
</Setter.Value>
</Setter>

关于c# - 具有附加属性的 ControlTemplate 中的命令绑定(bind),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12716706/

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