你如何MarkupExtension
从代码中设置自定义?
您可以从 Xaml 轻松设置 if。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);
动态资源:使用 SetResourceReference
textBox.SetResourceReference(TextBox.StyleProperty, "MyStyle");
CustomMarkup:如何
MarkupExtension
从代码中设置自定义?在这种情况下,我应该打电话给我ProvideValue
,我该如何获得IServiceProvider
?*CustomMarkupExtension customExtension = new CustomMarkupExtension(); textBox.Text = customExtension.ProvideValue(??);
我在这个问题上发现的很少,所以可以做到吗?
HB已经回答了这个问题。只是在这里添加一些细节来说明我为什么要这样做。我试图为以下问题创建一个解决方法。
问题是你不能派生Binding
和覆盖ProvideValue
,因为它是密封的。您将不得不这样做:自定义 WPF 绑定标记扩展的基类。但是问题是,当您将 a 返回Binding
到 a时Setter
,您会遇到异常,但在 a 之外Style
它可以正常工作。
我已经在几个地方读到过,如果它是 a ,则您应该返回它MarkupExtension
本身,以允许它在应用于实际时重新评估,这是有道理的。TargetObject
Setter
FrameworkElement
但是,这只适用TargetProperty
于 type object
,否则异常返回。如果您查看源代码,BindingBase
您会发现它确实做到了这一点,但该框架似乎有一些使其工作的秘密成分。