WPF XAML绑定不拾取DependencyProperty值

时间:2016-09-20 17:34:11

标签: c# wpf xaml binding

我有真的简单UserControl

<UserControl x:Class="Namespace.Views.TabViews.TabViewTemplate"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
             mc:Ignorable="d" 
             d:DesignHeight="900" d:DesignWidth="880" 
             d:DataContext="{d:DesignData Type=TabViewTemplate}">
    <UserControl.Template>
        <ControlTemplate TargetType="UserControl">
            <Grid Background="White">
                <Grid.RowDefinitions>
                    <RowDefinition Height="Auto"/>
                    <RowDefinition Height="*"/>
                </Grid.RowDefinitions>
                <Border Grid.Row="0" BorderBrush="#FFB31B16" BorderThickness="0,0,0,1" Margin="20" VerticalAlignment="Top">
                    <TextBlock VerticalAlignment="Bottom" FontSize="20" LineHeight="24" Margin="0,0,0,5" Text="{Binding RelativeSource={RelativeSource AncestorType=UserControl}, Path=Title}"/>
                </Border>
                <Border Grid.Row="1" Padding="20">
                    <ContentPresenter ContentSource="Content"/>
                </Border>
            </Grid>
        </ControlTemplate>
    </UserControl.Template>
</UserControl>

它背后的代码

using System;
using System.Windows;
using System.Windows.Markup;

namespace Namespace.Views.TabViews {
    /// <summary>
    /// Interaction logic for TabViewTemplate.xaml
    /// </summary>
    [ContentProperty("Content")]
    public partial class TabViewTemplate {

        public static readonly DependencyProperty TitleProperty =
            DependencyProperty.Register("Title", typeof(string), typeof(TabViewTemplate), 
                new FrameworkPropertyMetadata(
                    "Sample",
                    FrameworkPropertyMetadataOptions.AffectsRender,
                    OnTitleChanged)
                );

        private static void OnTitleChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) {
            var control = d as TabViewTemplate;
            if (control != null) control.Title = (string)e.NewValue;
        }

        public TabViewTemplate() {
            InitializeComponent();
        }

        public static void SetTitle(TabViewTemplate element, string value) {
            element.SetValue(TitleProperty, value);
        }

        public static string GetTitle(TabViewTemplate element) {
            return (string) element.GetValue(TitleProperty);
        }

        public string Title
        {
            get { return (string)GetValue(TitleProperty); }
            set { SetValue(TitleProperty, value); }
        }
    }
}

我像这样使用那段代码

<UserControl x:Class="Namespace.Views.TabViews.WelcomeTabView"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
             xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
             xmlns:gif="http://wpfanimatedgif.codeplex.com"
             xmlns:tabViews="clr-namespace:Namespace.Views.TabViews"
             mc:Ignorable="d" 
             d:DesignHeight="300" d:DesignWidth="300">
    <tabViews:TabViewTemplate Title="Welcome">
        <Grid>
            <Border BorderBrush="Coral" BorderThickness="2" Margin="0">
                <Image gif:ImageBehavior.AnimatedSource="../../Resources/js_cfg_install_howto.gif"/>
            </Border>
        </Grid>
    </tabViews:TabViewTemplate>
</UserControl>

然而,值“Welcome”通过属性得到set - 我通过属性setter上的断点看到了这一点 - 但是从不调用get。我已经使用了各种Binding组合,但没有一个能够工作。通过DependencyProperty设置TextBlock文本的“正确”方法是什么?谢谢!

1 个答案:

答案 0 :(得分:1)

它正在运作。我的TextBlock需要一个黑色前景才能看到文字。