如何在通用Windows应用程序中绑定模板内的空值?

时间:2015-09-28 08:27:22

标签: c# xaml win-universal-app uwp

在您回答之前,请查看this post

首先获得答案可以解决以下问题。

这是一个刚刚开始使用Windows 10(Universal Apps)的问题。在Windows 8.1和其他所有XAML技术中,这种技术完美无瑕。这是空白通用应用程序项目中的设置:

1。具有附加属性的静态类

创建一个包含Brush类型的附加属性的类。把它放在项目的任何地方。

public static class MySettings
{
    public static Brush GetAccentBrush(DependencyObject d)
    {
        return (Brush)d.GetValue(AccentBrushProperty);
    }

    public static void SetAccentBrush(DependencyObject d, Brush value)
    {
        d.SetValue(AccentBrushProperty, value);
    }

    public static readonly DependencyProperty AccentBrushProperty = DependencyProperty.RegisterAttached(
        "AccentBrush",
        typeof(Brush),
        typeof(MySettings),
        null
        );
}

2。使用附加属性

将控件添加到MainPage.xaml

在主页面中,添加ContentControl一个自定义模板,其中Grid的背景颜色设置为重点画笔。重点画笔设置为一种风格。

<Page x:Class="UniversalTest.MainPage"
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
      xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
      xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
      xmlns:local="using:UniversalTest"
      mc:Ignorable="d">
    <Page.Resources>
        <Style x:Key="MyControl"
               TargetType="ContentControl">
            <Setter Property="local:MySettings.AccentBrush"
                    Value="Green" /> <!-- Setting value here -->
        </Style>
    </Page.Resources>

    <Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">

        <ContentControl Style="{StaticResource MyControl}">
            <ContentControl.Template>
                <ControlTemplate TargetType="ContentControl">
                    <Grid Background="{TemplateBinding local:MySettings.AccentBrush}"> <!-- Using value here -->
                        <TextBlock Text="Howdy World!" />
                    </Grid>
                </ControlTemplate>
            </ContentControl.Template>
        </ContentControl>

    </Grid>
</Page>

如果您现在运行应用程序,它将显示绿色背景。一切正常。但是,如果将值设置为{x:Null},则会抛出异常。

<Page.Resources>
    <Style x:Key="MyControl"
            TargetType="ContentControl">
        <Setter Property="local:MySettings.AccentBrush"
                Value="{x:Null}" /> <!-- Null value here -->
    </Style>
</Page.Resources>

有人想拍这个吗?

3 个答案:

答案 0 :(得分:2)

为了记录,此问题似乎已修复。我的项目引用了通用Windows版本10.0.10240.0。按照原始海报的描述将画笔设置为{x:Null}可以正常工作。

答案 1 :(得分:0)

您可以添加假附加属性:

    public static Brush GetNullAccentBrush(DependencyObject d)
    {
        return (Brush)d.GetValue(NullAccentBrushProperty);
    }

    public static void SetNullAccentBrush(DependencyObject d, Brush value)
    {
        d.SetValue(NullAccentBrushProperty, value);
    }

    public static readonly DependencyProperty NullAccentBrushProperty = DependencyProperty.RegisterAttached(
        "NullAccentBrush",
        typeof(SolidColorBrush),
        typeof(MySettings),
        null
        );

绑定你的属性设置器:

<Setter Property="local:MySettings.AccentBrush"
        Value="{Binding local:MySettings.NullAccentBrush}" />

网格背景为空(即使NullAccentBrush上没有真正的绑定......)。

答案 2 :(得分:0)

我发现此代码在资源文件

中有效
<Color x:Key="BgNull"></Color>

然后在你的风格中使用该链接到BgNull

<Setter Property="Background" Value="{StaticResource BgNull}"/>