MarkupExtension
コードからカスタムを設定するにはどうすればよいですか?
Xamlからなら簡単に設定できます。Binding
と についても同様DynamicResource
です。
<TextBox FontSize="{Binding MyFontSize}"
Style="{DynamicResource MyStyle}"
Text="{markup:CustomMarkup}"/>
コードビハインドで同じ値を設定するには、少し異なるアプローチが必要です
バインディング: textBox.SetBinding または BindingOperations.SetBinding を使用します。
Binding binding = new Binding("MyFontSize"); BindingOperations.SetBinding(textBox, TextBox.FontSizeProperty, binding);
DynamicResource: SetResourceReference を使用
textBox.SetResourceReference(TextBox.StyleProperty, "MyStyle");
CustomMarkup:
MarkupExtension
コードからカスタムを設定するにはどうすればよいですか?ProvideValue
その場合、どうすれば a を取得できますIServiceProvider
か?*CustomMarkupExtension customExtension = new CustomMarkupExtension(); textBox.Text = customExtension.ProvideValue(??);
この件に関して驚くほどほとんど見つけられなかったので、できますか?
HBは質問に答えました。なぜこれをやりたかったのか、ここにいくつかの詳細を追加するだけです。次の問題の回避策を作成しようとしました。
問題は、封印されているため、派生しBinding
てオーバーライドできないことです。ProvideValue
代わりに、次のようなことを行う必要があります: A base class for custom WPF binding markup extensions。しかし、問題は、 aBinding
を a に返すSetter
と例外が発生することですが、それ以外ではStyle
正常に動作します。
が実際に適用された後に再評価できるようにする場合は、MarkupExtension
それ自体を返す必要があることをいくつかの場所で読みましたが、これは理にかなっています。TargetObject
Setter
FrameworkElement
ただし、それTargetProperty
は が typeobject
の場合にのみ機能し、それ以外の場合は例外が返されます。ソースコードをBindingBase
見ると、まさにこれを行っていることがわかりますが、フレームワークにはそれを機能させる秘密の要素があるようです。