Я создал прикрепленное свойство и конвертер для этого. Возможно, у вас уже есть конвертер, поэтому замените мою ссылку на CaseConverter на любую имеющуюся у вас реализацию.
Присоединенное свойство - это просто логическое значение, которое вы устанавливаете, если хотите, чтобы оно было в верхнем регистре (вы, очевидно, могли бы расширить его, чтобы вместо этого быть перечисляемым для выбора стилей). Когда свойство изменяется, оно связывает свойство Text TextBlock по мере необходимости, добавляя в конвертер.
Может потребоваться немного больше работы, когда свойство уже связано - мое решение предполагает, что это простая привязка Path. Но может потребоваться дублирование источника и т. Д. Однако я подумал, что этого примера достаточно, чтобы донести свою мысль.
Вот прикрепленное свойство:
public static bool GetUppercase(DependencyObject obj)
{
return (bool)obj.GetValue(UppercaseProperty);
}
public static void SetUppercase(DependencyObject obj, bool value)
{
obj.SetValue(UppercaseProperty, value);
}
// Using a DependencyProperty as the backing store for Uppercase. This enables animation, styling, binding, etc...
public static readonly DependencyProperty UppercaseProperty =
DependencyProperty.RegisterAttached("Uppercase", typeof(bool), typeof(TextHelper), new PropertyMetadata(false, OnUppercaseChanged));
private static void OnUppercaseChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
TextBlock txt = d as TextBlock;
if (txt == null) return;
var val = (bool)e.NewValue;
if (val)
{
// rebind the text using converter
// if already bound, use it as source
var original = txt.GetBindingExpression(TextBlock.TextProperty);
var b = new Binding();
if (original != null)
{
b.Path = original.ParentBinding.Path;
}
else
{
b.Source = txt.Text;
}
b.Converter = new CaseConverter() { Case = CharacterCasing.Upper };
txt.SetBinding(TextBlock.TextProperty, b);
}
}