2012-04-23 127 views
0

我试图附加一个属性,就像ItemsControl.AlternationIndexItemsControl。 像下面这样使用它会导致在构建时出现“无法找到模板属性”错误。 附属财产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中可见和可用?

回答

0

你不应该寄存器附着这样的性质,所属的类是任何控制你打算设置的财产( - 你可以将它任何地方不管是什么 - ),但是类中的财产被定义为。因此,将typeof(ItemsControl)更改为typeof(WhatEverTheSurroundingClassIs)

同样,你将需要使用命名空间映射为你的类的组合命名空间的类名称为目标的XAML属性:

Property="local:WhatEverTheSurroundingClassIs.Position"