ControlTemplate绑定到附加的DependencyProperty

时间:2016-11-02 13:05:10

标签: c# xaml uwp

我正在为Run-time exception (line 21): The type initializer for 'Telerik.JustMock.Core.Context.MockingContext' threw an exception. Stack Trace: [System.Security.SecurityException: Request for the permission of type 'System.Security.Permissions.FileIOPermission, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' failed.] [System.TypeInitializationException: The type initializer for 'Telerik.JustMock.Core.Context.MockingContext' threw an exception.] at Program.Main(): line 21 创建ControlTemplate,其中显示带边框的ContentControl,其背景可以是彩色的。我创建了一个附加属性来保存一个属性,该属性定义是否显示背景。我似乎无法正确地将语法绑定到附加属性到模板中元素的TextBox属性。

附属物是:

Visibility

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>

HasContentConverter:

<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>

运行应用程序(部署在ARM移动设备上)时,输出中会显示以下错误

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
        }
    ...

当我改变

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

如何设置绑定到属性?

1 个答案:

答案 0 :(得分:0)

我无法在这里测试UWP,因为我们仍然在Win7上,但在WPF中,您的附加属性定义很好,包括名称。看起来我错了那个部分。我仍然只是按照惯例重命名,但WPF并不关心。也许UWP确实 - 我确定。

对我来说,测试代码的原因只是绑定路径。它需要围绕Path的parens,因为它是附加属性,并且它们具有不遵循C#属性命名约定的复杂名称:

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

Path周围的parens告诉它整个字符串表示一个精心设计的属性名称,因此它con:AttachedPropertyExtensions.BackgroundVisible定义字段的DependencyProperty。否则,它认为con:AttachedPropertyExtensions应该是模板化父级的属性,它具有自己的属性BackgroundVisible。但这甚至没有意义。即使这不是语法错误:

public Visibility con:AttachedPropertyExtensions{ get; set; }

......这不是你在这里尝试沟通的内容。

如果我将PresentationTraceSources.TraceLevel=High添加到您的原始Binding,那么调试跟踪输出中失败的部分就是:

  

System.Windows.Data警告:108:BindingExpression(hash = 4917414):在级别0 - 对于ContentControl.con:AttachedPropertyExtensions找到了访问者&lt; null&gt;

     

System.Windows.Data错误:40:BindingExpression路径错误:&#39; con:AttachedPropertyExtensions&#39;在&#39; object&#39;上找不到的属性&#39;&#39; ContentControl中&#39; (名称=&#39;&#39;)&#39 ;. BindingExpression:路径= CON:AttachedPropertyExtensions.BackgroundVisibility;的DataItem =&#39; ContentControl中&#39; (名称=&#39;&#39);目标元素是边境&#39; (名称=&#39;&#39);目标财产是“可见性”&#39; (键入&#39;可见性&#39;)

     

System.Windows.Data警告:103:BindingExpression(hash = 4917414):将第1级的项替换为{NullDataItem}