このための添付プロパティとコンバーターを作成しました。おそらく既にコンバーターを持っているので、CaseConverter への私の参照を、あなたが持っている実装に置き換えてください。
添付プロパティは、大文字にしたい場合に設定する単なるブール値です (これを拡張して、代わりにスタイルの選択に対して列挙可能にすることができます)。プロパティが変更されると、必要に応じて TextBlock の Text プロパティを再バインドし、コンバーターに追加します。
プロパティが既にバインドされている場合は、もう少し作業が必要になる場合があります。私のソリューションでは、それが単純なパス バインドであると想定しています。ただし、ソースなどを複製する必要がある場合もあります。ただし、この例は、私の主張を理解するには十分であると感じました。
添付プロパティは次のとおりです。
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);
}
}