2016-11-02 75 views
1

我为ContentControl创建了ControlTemplate,该项显示边界为TextBox的背景可以着色。我创建了一个附加属性来保存一个属性,该属性定义是否显示背景。我似乎无法得到正确的语法绑定到模板中元素的Visibility属性的附加属性。ControlTemplate绑定到附加的依赖项属性

的附加属性是:

public static class AttachedPropertyExtensions 
{ 
    public static readonly DependencyProperty 
     BackgroundVisible = DependencyProperty.RegisterAttached(
      "BackgroundVisible", 
      typeof(Visibility), 
      typeof(AttachedPropertyExtensions), 
      new PropertyMetadata(default(Visibility))); 

    public static void SetBackgroundVisible(UIElement element, Visibility value) 
    { 
     element.SetValue(BackgroundVisible, value); 
    } 

    public static Visibility GetBackgroundVisible(UIElement element) 
    { 
     return (Visibility)element.GetValue(BackgroundVisible); 
    } 
} 

ControlTemplate

<ControlTemplate x:Key="BorderedTextBlock" TargetType="ContentControl"> 
    <Grid Margin="{StaticResource TextControlMarginThemeThickness}" 
      BorderBrush="{StaticResource TextBoxBorderThemeBrush}" 
      BorderThickness="{StaticResource TextControlBorderThemeThickness}"> 
     <Border x:Name="backgroundBorder" 
       Background="{TemplateBinding Background}" 
       Visibility="{Binding Path=con:AttachedPropertiesExtensions.BackgroundVisible, RelativeSource={RelativeSource Mode=TemplatedParent}}" /> 

     <ScrollViewer HorizontalScrollMode="Disabled" 
         VerticalScrollMode="Enabled" 
         VerticalScrollBarVisibility="Visible"> 
      <ContentPresenter Height="80" 
           TextWrapping="Wrap" 
           Margin="{StaticResource TextControlThemePadding}" /> 
     </ScrollViewer> 

    </Grid> 
</ControlTemplate> 

并且这些是使用与用于:

<UserControl ... 
      xmlns:con="using:Scanners.Tetra.UWPmvvm.Helpers"> 
... 
    <ContentControl x:Name="lblReturnText" 
        Template="{StaticResource BorderedTextBlock}" 
        Content="{Binding ReturnText}" 
        Background="#DDDDDD" 
        con:AttachedPropertyExtensions.BackgroundVisible="{Binding ReturnText, Converter={StaticResource HasContentConverter}}" /> 
    <ContentControl x:Name="lblErrorText" 
        Template="{StaticResource BorderedTextBlock}" 
        Content="{Binding ErrorText}" 
        Background="#C03556" 
        con:AttachedPropertyExtensions.BackgroundVisible="{Binding ErrorText, Converter={StaticResource HasContentConverter}}" /> 
</UserControl> 

HasContentConverter:

class HasContentConverter : IValueConverter 
{ 
    public object Convert(object value, Type targetType, object parameter, string language) 
    { 
     string val = (string)value; 
     string.IsNullOrWhiteSpace(val)) 
     { 
      return Visibility.Visible; 
     } 
     else 
     { 
      return Visibility.Collapsed 
     } 
    ... 

当应用程序被运行(部署在ARM移动设备上),被显示在输出

Error: BindingExpression path error: 'con:AttachedPropertiesExtensions' property not found on 'Windows.UI.Xaml.Controls.ContentControl'. BindingExpression: Path='con:AttachedPropertiesExtensions.BackgroundVisible' DataItem='Windows.UI.Xaml.Controls.ContentControl'; target element is 'Windows.UI.Xaml.Controls.Border' (Name='backgroundBorder'); target property is 'Visibility' (type 'Visibility') 

当我改变跟随误差

Path=con:AttachedPropertiesExtensions.BackgroundVisible 

Path=(con:AttachedPropertiesExtensions.BackgroundVisible) 

(或带括号的任何东西)在建立整个ControlTemplate时发生错误:

The text associated with this error code could not be found. 
E_UNKNOWN_ERROR 

如何设置绑定到属性?

+1

首先,正确命名静态只读域:'公共静态只读的DependencyProperty BackgroundVisibleProperty = ... 。' –

+0

好的,但附加的属性似乎对'ContentControl'有效:HasContentConverter中的一个断点成功中断,并且输出中没有消息。只有当在实际模板 –

回答

0

我不能在这里测试UWP,因为我们仍然在Win7上,但在WPF中,您附加的属性定义没问题,包括名称。看起来我对这部分错了。我仍然会重命名它只是遵循约定,但WPF不在乎。也许UWP会 - 我会确定的。

对我来说破了什么,测试你的代码,只是绑定路径。它需要Path周围的括号,因为它是一个附加属性,而且他们有复杂的不遵循的C#属性命名约定的名称:整个字符串表示

Visibility="{Binding (con:AttachedPropertyExtensions.BackgroundVisible), RelativeSource={RelativeSource TemplatedParent}}" 

Path周围的括号告诉它一个单一的精心制作属性名称,所以DependencyProperty定义字段为con:AttachedPropertyExtensions.BackgroundVisible。否则,它认为con:AttachedPropertyExtensions应该是模板父代的一个属性,它具有其自己的名称为BackgroundVisible的属性。但这甚至没有意义。即使这不是语法错误:

public Visibility con:AttachedPropertyExtensions{ get; set; } 

......这不是你要在这里沟通的东西。

如果我添加PresentationTraceSources.TraceLevel=High你原来Binding,这里的调试跟踪输出的一部分,其中失败:

System.Windows.Data Warning: 108 : BindingExpression (hash=4917414): At level 0 - for ContentControl.con:AttachedPropertyExtensions found accessor <null>

System.Windows.Data Error: 40 : BindingExpression path error: 'con:AttachedPropertyExtensions' property not found on 'object' ''ContentControl' (Name='')'. BindingExpression:Path=con:AttachedPropertyExtensions.BackgroundVisibility; DataItem='ContentControl' (Name=''); target element is 'Border' (Name=''); target property is 'Visibility' (type 'Visibility')

System.Windows.Data Warning: 103 : BindingExpression (hash=4917414): Replace item at level 1 with {NullDataItem}

+1

的边界上绑定到'Visibility'时才使用。我曾尝试过,但Visual Studio在编译时抛出了一个'E_UNKNOWN_ERROR'错误。我刚刚尝试在午餐时间关闭Visual Studio,并且这次它工作。我的猜测是VS变得困惑(它似乎对UWP有很大的影响)。谢谢 –

+0

@JonathanTwite从2008年左右开始,Visual Studio就更容易与每个版本混淆了。 –