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