将 Collection 类型的 AttachedProperty 绑定到 TemplatedParent

问题描述 投票:0回答:1

我想创建一个附加属性来保存 MenuItem 对象的集合。这些将在我的 GroupBox 自定义 ControlTemplate 中使用。在该 ControlTemplate 中,我想使用自定义 DropDownButton,它继承自 ItemsControl 并将 MenuItems 放入其 Popup 中。

我在这个网站上找到了提示:
https://siderite.dev/blog/collection-attached-properties-with.html

这是我所拥有的:

附属财产:

public class General {
    public static readonly DependencyProperty MenuItemsProperty =
        DependencyProperty.RegisterAttached(
            "MenuItemsInternal",from convention
            typeof(ObservableCollection<MenuItem>), 
            typeof(General),
            new PropertyMetadata(default(ObservableCollection<MenuItem>)));

    public static ObservableCollection<MenuItem> GetMenuItems(UIElement element)
    {
         var collection = (ObservableCollection<MenuItem>) element.GetValue(MenuItemsProperty);
         if (collection == null)
         {
             collection = new ObservableCollection<MenuItem>();
             element.SetValue(MenuItemsProperty, collection);
         }
         return collection;
    }

    public static void SetMenuItems(UIElement element, ObservableCollection<MenuItem> value)
    {
        element?.SetValue(MenuItemsProperty, value);
    }
}

附加属性的使用:

...
<GroupBox Style="{StaticResource Style.GroupBox.EditableSubSection}">
    <ap:General.MenuItems>
        <MenuItem Header="Aktion abc" />
        <MenuItem Header="Aktion xyz" />
    </ap:General.MenuItems>
</GroupBox>

到目前为止一切顺利。这一切都有效。我的问题是我找不到在 GroupBox 的 ControlTemplate 中使用 MenuItems 集合的方法。

 <Style x:Key="Style.GroupBox.EditableSubSection"
        TargetType="{x:Type GroupBox}">
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="{x:Type GroupBox}">
                <Grid>
                    <Grid.RowDefinitions>
                        <RowDefinition Height="Auto" />
                        <RowDefinition Height="Auto" />
                        <RowDefinition Height="Auto" />
                    </Grid.RowDefinitions>
                    <TextBlock Text="{TemplateBinding Header}" />
                    <Separator Grid.Row="1" />
                    <ContentPresenter Grid.Row="2" />
                    <Grid Grid.Row="0" HorizontalAlignment="Right">
                        ...
                        <controls:DropDownButton Width="{Binding ActualHeight,
                                                                 RelativeSource={RelativeSource Self}}"
                                                 ItemsSource="{Binding Path=(ap:General.MenuItems),
                                                                       RelativeSource={RelativeSource TemplatedParent}}" />
                    </Grid>
                </Grid>
            </ControlTemplate>
        </Setter.Value>
    </Setter>

运行此程序时,问题似乎出在绑定上

 ItemsSource="{Binding Path=(ap:General.MenuItems), RelativeSource={RelativeSource TemplatedParent}}"

我收到异常并显示以下消息:

InvalidOperationException: Property path is not valid. 'General' does not have a public property named 'MenuItems'

有没有人以前经历过这种情况,或者有关于如何绑定到具有非常规名称的 AttachedProperty 的任何提示吗?

c# wpf xaml data-binding attached-properties
1个回答
0
投票

@Jinish 在评论中提供了答案。

我从代码中可以看到您的属性名称是“MenuItemsInternal”。据我所知,这不是用于 WPF 绑定目的的名称

将绑定更改为以下内容即可解决问题

ItemsSource="{Binding Path=(ap:General.MenuItemsInternal), RelativeSource={RelativeSource TemplatedParent}}"

由于无法将评论转换为答案,我正在回答我自己的问题,引用元上建议的评论:https://meta.stackexchange.com/a/1558

© www.soinside.com 2019 - 2024. All rights reserved.