2016-09-20 7 views
0

У меня есть действительно простой UserControlWPF XAML Binding Не собирание DependencyProperty Значение

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

Однако значение «Добро пожаловать» получает set через собственность - я вижу это через точку останова на настройщике свойств - однако get никогда не вызывается. Я использовал всевозможные комбинации связывания, ни одна из которых не работает. Каков «правильный» способ установки текста TextBlock посредством DependencyProperty? Благодаря!

+0

Вызывается ли 'OnTitleChanged'? Попробуйте добавить 'PresentationTraceSources.TraceLevel = High' к привязке' Title' в 'TextBlock'. Это даст вам след в области «Выход» о том, как Binding пытается разрешить источник и путь, который должен рассказать вам, в чем проблема. –

+0

Установщик свойства зависимости не может вызываться, когда его значение задано в XAML. Причина объясняется в [Свойствах загрузки и зависимости XAML] (https://msdn.microsoft.com/en-us/library/bb613563 (v = vs.110) .aspx) статьи в MSDN. Поэтому поставить точку останова не может. – Clemens

+0

Тем не менее, структура вашего UserControl выглядит сомнительной. Обычно вы просто добавляете элементы в панель верхнего уровня в свой XAML и связываете свойства элемента (например TextBlock.Text) с зависимыми свойствами UserControl (например, ваше свойство Title) с помощью 'Text = {Binding Title, RelativeSource = {RelativeSource AncestorType = UserControl}} "'. – Clemens

ответ

1

Он работал. Для того, чтобы увидеть текст, моему TextBlock нужен передний план черного.

+0

Вы могли бы удалить вопрос. – Clemens

Смежные вопросы