2013-07-04 8 views
0

У меня есть TextBlock по имени Price. У меня есть DataTrigger, который работает.Текст текстового блока WPF и DataTrigger

<DataTrigger Binding="{common:ComparisonBinding DataContext.Discount,GT,0}" Value="{x:Null}"> 
    <DataTrigger.Setters> 
     <Setter Property="Text" TargetName="price"> 
      <Setter.Value> 
       <Run>Value1</Run> 
       <Run>Value2</Run> 
      </Setter.Value>     
     </Setter> 
    </DataTrigger.Setters> 
</DataTrigger> 

Таким образом, это означает, что если Discount is > 0 он должен отображать это как Text.However перспективе внутри этого не работает. Мне нужна привязка, потому что мне нужен другой стиль текста.

ответ

2

Как сказано в сообщении xaml и @BasBrekelmans, вы пытаетесь присвоить элементу Run свойство, которое ожидает string.

Для вашего требования просто используйте MultiBinding с StringFormat, чтобы отформатировать значение вашей привязки в необходимом формате.

что-то вроде:

<DataTrigger Binding="{common:ComparisonBinding DataContext.Discount,GT,0}" 
       Value="{x:Null}"> 
    <Setter TargetName="price" 
      Property="Text"> 
     <Setter.Value> 
     <MultiBinding StringFormat="Some Custom Formatted Text Value1: {0} and Value2: {1}"> 
      <Binding Path="BindingValue1" /> 
      <Binding Path="BindingValue2" /> 
     </MultiBinding> 
     </Setter.Value> 
    </Setter> 
</DataTrigger> 

Если это визуальный стиль TextBlock вы пытаетесь настроить с инлайн Binding-х Yeh вы лучше модифицировать шаблон элемента управления с лучшим элементом, чем один TextBlock к позвольте этому.

Однако вы можете использовать работу вокруг с помощью преобразователя и применяя ваш DataTrigger.Setter к TextBlock.Tag

Сай что-то вроде:

public class TextBlockInlineFormatConverter : IMultiValueConverter { 
    public object Convert(object[] values, Type targetType, object parameter, CultureInfo culture) { 
    if (values.Length < 3) 
     return null; 
    TextBlock textblock = values[0] as TextBlock; 
    if (textblock == null) 
     return null; 
    textblock.ClearValue(TextBlock.TextProperty); 
    textblock.Inlines.Add(new Run("Some text ") { Foreground = Brushes.Tomato }); 
    textblock.Inlines.Add(new Run(values[1].ToString()) { Foreground = Brushes.Blue }); 
    textblock.Inlines.Add(new Run(" and Some other text ") { Foreground = Brushes.Tomato }); 
    textblock.Inlines.Add(new Run(values[2].ToString()) { Foreground = Brushes.Blue, FontWeight = FontWeights.Bold }); 
    return textblock.Tag; 
    } 

    public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture) { 
    throw new NotImplementedException(); 
    } 
} 

и использования:

<DataTrigger Binding="{common:ComparisonBinding DataContext.Discount,GT,0}" 
       Value="{x:Null}"> 
    <!-- Note the setter is on Tag and not Text since we modify the Text using Inlines within the converter --> 
    <Setter TargetName="price" 
      Property="Tag"> 
     <Setter.Value> 
     <MultiBinding Converter="{StaticResource TextBlockInlineFormatConverter}" 
         Mode="OneWay"> 
      <Binding Path="." 
        RelativeSource="{RelativeSource Self}" /> 
      <Binding Path="BindingValue1" /> 
      <Binding Path="BindingValue2" /> 
     </MultiBinding> 
     </Setter.Value> 
    </Setter> 
</DataTrigger> 

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

+0

Это был действительно умный чувак :) спасибо. Однако из-за временного давления я добавил второй текстовый блок с пустым текстом и с помощью триггера изменил его текст. Я не уверен, что более эффективно. – GorillaApe

1

Совокупность Run элементов не применимо к объекту Text, являющегося строкой. Правильное свойство - Inlines.

К сожалению, это свойство не имеет сеттера, должен быть другой способ решения этого вопроса, например. с ContentControl с двумя TextBlock с в StackPanel.

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