2016-04-12 8 views
1

Я хочу добавить пользовательское свойство (через свойство зависимостей) в свой шаблон ToggleButton. Теперь я хочу, чтобы значение содержащейся метки (как заполнителя для будущей реализации) было объединенным значением, например «Hello» и фактическим значением свойства.WPF TemplateBinding Concatenate String для значения

Без конкатенации он прекрасно работает (отображение «Воин» на этикетке)

Но когда я пытаюсь установить метку в виде конкатенации XAML оленья кожа компилировать больше.

<Label Content="Hello {TemplateBinding local:HeroClassCheckbox.HeroClass}"/> 

Как я могу достичь этого?

Остальная часть Кодекса:

Мой .xaml

<Window.Resources> 
    <ResourceDictionary> 
     <Style x:Key="HeroClassCheckbox" TargetType="ToggleButton"> 
      <Setter Property="Content" Value="Green" /> 
      <Setter Property="local:HeroClassCheckbox.HeroClass" Value="NoClass"/> 
      <Setter Property="Template"> 
       <Setter.Value> 
        <ControlTemplate TargetType="{x:Type ToggleButton}"> 
         <Label Content="{TemplateBinding local:HeroClassCheckbox.HeroClass}"/> 
        </ControlTemplate> 
       </Setter.Value> 
      </Setter> 
     </Style> 
    </ResourceDictionary> 
</Window.Resources> 
<Grid> 
    <ToggleButton Width="150" Height="50" local:HeroClassCheckbox.HeroClass="Warrior" Style="{DynamicResource HeroClassCheckbox}"/> 
</Grid> 

Мои .xaml.cs

public static class HeroClassCheckbox 
{ 
    public static readonly DependencyProperty HeroClassProperty = DependencyProperty.RegisterAttached("HeroClass", 
     typeof(string), typeof(HeroClassCheckbox), new FrameworkPropertyMetadata(null)); 

    public static string GetHeroClass(UIElement element) 
    { 
     if (element == null) 
      throw new ArgumentNullException("element"); 
     return (string)element.GetValue(HeroClassProperty); 
    } 
    public static void SetHeroClass(UIElement element, string value) 
    { 
     if (element == null) 
      throw new ArgumentNullException("element"); 
     element.SetValue(HeroClassProperty, value); 
    } 
} 

ответ

1

Вы должны использовать преобразователь в качестве подхода к цели. Вот пример ..

public class HelloLabelConverter : IValueConverter 
    { 
      public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
      { 
        char[] removeThis = "Hello ".ToCharArray(); 
        return value.ToString().TrimStart(removeThis); 
      } 

      public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
      { 
        return string.Format("Hello {0}", value); 
      } 
    } 

    <Window.Resources> 
      <local:HelloLabelConverter x:Key="HelloLabelConverter" /> 
    </Window.Resources> 
    <Grid> 
     <Label Content="{Binding ElementName= lblPropertyToBind, Path=Text, Converter={StaticResource HelloLabelConverter}}"></Label> 
    </Grid> 
+0

, который выглядит как именно то, что я искал, но, к сожалению, он бросает: «Название„HelloLabelConverter“не существует в пространстве имен„CLR-имен:. WpfApplication1“\t WpfApplication1 « , что нечетно, поскольку оно явно существует. Что я здесь делаю неправильно? [.xaml] (http://pastebin.com/Fm7esb4S) [.xaml.cs] (http://pastebin.com/Q8urWFQJ) –

+0

Это трудно понять, что вопрос, когда мы не можем видеть структуру ваших файлов проекта. Ищите учебники о том, как использовать преобразователи значений и посмотрите, помогает ли это –

+0

Это стандартный проект (проект project-> wpf project), но я буду искать учебник по конвертерам значений. –