“找不到模板属性”

时间:2012-04-23 09:54:12

标签: c# wpf xaml dependency-properties attached-properties

我尝试将ItemsControl.AlternationIndex添加到ItemsControl的属性。 如下所示使用它会导致构建时“无法找到模板属性”错误。 附加属性AlternationIndex工作正常。

        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type TabItem}">
                    <Grid SnapsToDevicePixels="true">
                        <Border x:Name="Bd" ... >
                            <ContentPresenter x:Name="Content" ... />
                        </Border>
                    </Grid>
                    <ControlTemplate.Triggers>
                        <Trigger Property="ItemsControl.Position" 
                                 Value="Last">
                            <Setter Property="CornerRadius" 
                                    TargetName="Bd" 
                                    Value="0,0,0,4"/>
                        </Trigger>
                        <Trigger Property="ItemsControl.AlternationIndex" 
                                 Value="0">
                            <Setter Property="CornerRadius" 
                                    TargetName="Bd" 
                                    Value="4,0,0,0"/>
                        </Trigger>
                        ...
                    </ControlTemplate.Triggers>
                </ControlTemplate>
            </Setter.Value>
        </Setter>

该属性的代码放在保存模板设置器的同一WPF控件的代码隐藏中。

    public enum Position
    {
        First,
        Normal,
        Last
    }

    private static readonly DependencyPropertyKey PositionPropertyKey =
       DependencyProperty.RegisterAttachedReadOnly(
            "Position",
            typeof(Position),
            typeof(ItemsControl),
            new FrameworkPropertyMetadata(Position.Normal,
                 FrameworkPropertyMetadataOptions.Inherits));

    public static readonly DependencyProperty PositionProperty =
        PositionPropertyKey.DependencyProperty;

    public static Position GetPosition(DependencyObject element)
    {
        if (element == null)
            throw new ArgumentNullException("element");

        var result = element.GetValue(PositionProperty);

        return (Position)result;
    }

    internal static void SetPosition(DependencyObject d, Position value)
    {
        d.SetValue(PositionPropertyKey, value);
    }

    internal static void ClearPosition(DependencyObject d)
    {
        d.ClearValue(PositionPropertyKey);
    }

在XAML中使属性可见和可用需要什么?

1 个答案:

答案 0 :(得分:0)

您不应该注册这样的附加属性,拥有类您想要设置属性的任何控件( - 您可以将设置为,无论什么 - )但是定义属性的类。因此,将typeof(ItemsControl)更改为typeof(WhatEverTheSurroundingClassIs)

同样,您需要使用类的名称空间的名称空间映射以及类名来定位XAML中的属性:

Property="local:WhatEverTheSurroundingClassIs.Position"