davidbitton
davidbitton

Reputation: 818

WPF XAML Binding Not Picking Up DependencyProperty Value

I have a really simple 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>

and it's code behind

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); }
        }
    }
}

I make use of that code like this

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

However the value "Welcome" gets set via the property -- I see this via a breakpoint on the property setter -- however the get is never called. I have used all sorts of Binding combinations, none of which work. What is the "correct" way to set the TextBlock Text by way of a DependencyProperty? Thanks!

Upvotes: 0

Views: 74

Answers (1)

davidbitton
davidbitton

Reputation: 818

It was working. My TextBlock needed a Foreground of Black in order to see the text.

Upvotes: 1

Related Questions