2015-05-27 5 views
2

Я пытаюсь привязать данные к ярлыку и изменить его цвет и текст в ответ на значение свойства bound. Я использую ControlTemplate для изменения цвета и текста, потому что изменение содержимого метки в ответ на DataTriggers не сработало (текст так и не появился).Не удается получить доступ к текстовому свойству TextBlock в ControlTemplate

Таким образом, использование ControlTemplate работает при определении его встроенного в Label, но, похоже, не работает при определении шаблона в качестве ресурса.

Код, приведенный ниже, является более простым примером для демонстрации проблемы.

Это то, что я до сих пор:

<ResourceDictionary> 
     <ControlTemplate x:Key="baseTemplate" TargetType="{x:Type Label}"> 
      <Grid Background="{TemplateBinding Background}"> 
       <Grid.ColumnDefinitions> 
        <ColumnDefinition Width="24"/> 
        <ColumnDefinition Width="Auto"/> 
        <ColumnDefinition Width="24"/> 
       </Grid.ColumnDefinitions> 
       <TextBlock x:Name="InnerTextBlock" Grid.Column="1" 
          Text="{TemplateBinding Label.Content}" <!-- An attempt to tie the Text here to the Label's Content property --> 
          VerticalAlignment="{TemplateBinding VerticalContentAlignment}" 
          HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" 
          Padding="{TemplateBinding Padding}" 
          Background="{TemplateBinding Background}" 
          Foreground="{TemplateBinding Foreground}" 
          Width="{TemplateBinding Width}" 
          Height="{TemplateBinding Height}" 
        /> 
      </Grid> 
     </ControlTemplate> 

     <Style x:Key="availableLabelStyle" TargetType="{x:Type Label}"> 
      <Setter Property="Background" Value="#FF567E4A"/> 
      <Setter Property="Foreground" Value="White"/> 
      <Setter Property="Content" Value="Available"/> 
      <Setter Property="Template" Value="{StaticResource baseTemplate}"/> 
     </Style> 
    </ResourceDictionary> 

    <Label x:Name="StatusLabel" 
      Style="{StaticResource availableLabelStyle}" 
      Grid.Column="1" 
      HorizontalAlignment="Left" 
      Margin="111,71,0,0" 
      VerticalAlignment="Top" Width="124" 
      HorizontalContentAlignment="Center" 
      VerticalContentAlignment="Center" 
      Height="18" 
      Padding="2" 
    /> 

Проблема заключается в том, что содержание недвижимости в сеттер для «availableLabelStyle», кажется, не работает. Текст не отображается, если этот стиль применяется к ярлыку.

Есть ли лучший способ сделать то же самое здесь И получить текст, чтобы он появился в ярлыке?

Заранее благодарим за помощь.

+0

Я просто попробовал это в пустом проекте Blend (скопировал ControlTemplate/Style в Window.Resources и добавил ярлык в сетку), и он отлично работал. Ярлык появился зеленым. Белый текст. «Доступно» на этикетке. – Tim

+0

@Tim Спасибо. Что-то еще должно мешать в окне, которое я разрабатываю. Я должен был проверить это в тестовом проекте, прежде чем задавать этот вопрос здесь. – sorton9999

ответ

2

Код, который у вас есть, работает. Вот мой полный пример:

<Window x:Class="WPFTestApp2.MainWindow" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     Title="MainWindow" Height="350" Width="525"> 
    <Window.Resources> 
     <ResourceDictionary> 
    <ControlTemplate x:Key="baseTemplate" TargetType="{x:Type Label}"> 
     <Grid Background="{TemplateBinding Background}"> 
      <Grid.ColumnDefinitions> 
       <ColumnDefinition Width="24"/> 
       <ColumnDefinition Width="Auto"/> 
       <ColumnDefinition Width="24"/> 
      </Grid.ColumnDefinitions> 
      <TextBlock Grid.Column="1" Text="{TemplateBinding Label.Content}" 
          VerticalAlignment="{TemplateBinding VerticalContentAlignment}" 
          HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" 
          Padding="{TemplateBinding Padding}" 
          Background="{TemplateBinding Background}" 
          Foreground="{TemplateBinding Foreground}" 
          Width="{TemplateBinding Width}" 
          Height="{TemplateBinding Height}"/> 
     </Grid> 
    </ControlTemplate> 

    <Style x:Key="availableLabelStyle" TargetType="{x:Type Label}"> 
     <Setter Property="Background" Value="#FF567E4A"/> 
     <Setter Property="Foreground" Value="White"/> 
     <Setter Property="Content" Value="Available"/> 
     <Setter Property="Template" Value="{StaticResource baseTemplate}"/> 
    </Style> 
</ResourceDictionary> 
    </Window.Resources> 
    <Grid> 
     <Label x:Name="StatusLabel" Style="{StaticResource availableLabelStyle}" 
      Grid.Column="1" 
      HorizontalAlignment="Left" 
      Margin="111,71,0,0" 
      VerticalAlignment="Top" Width="124" 
      HorizontalContentAlignment="Center" 
      VerticalContentAlignment="Center" 
      Height="18" 
      Padding="2"/> 
    </Grid> 
</Window> 

Который производит следующий вывод:

enter image description here

+0

Спасибо, что посмотрели на это для меня. Я должен проверить, почему это не работает в моем окне. У меня есть Grid с кучей ярлыков, которые работают одинаково. Ни один из них не показывает текст. Странный. – sorton9999

+1

Я нашел проблему. Я унаследовал окно, которое я разрабатываю, и я не заметил, что DataContext каждого ярлыка был установлен в свойство в коде. Это мешало моим новым привязкам в XAML. Проклятия! – sorton9999

0

Другой способ сделать это состоит в использовании ContentPresenter вместо TextBlock. Вы можете добавить к нему все свои дополнительные свойства (по крайней мере, те, которые вы показали), и это позволит отображать контент, отличный от текста.

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