如何从代码设置自定义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
而且这种情况下,我怎么得到的IServiceProvider
?*CustomMarkupExtension customExtension = new CustomMarkupExtension(); textBox.Text = customExtension.ProvideValue(??);
保持我发现关于这个问题的令人惊讶的一点,所以,能不能做到?
H.B.已回答了问题。只是在这里添加一些细节,为什么我想这样做。我试图为以下问题创建解决方法。
问题是你不能从Binding
派生并覆盖ProvideValue
,因为它是密封的。你必须这样做,而不是:A base class for custom WPF binding markup extensions。但问题是,当您将Binding
返回到Setter
时,您会得到一个例外,但在Style
之外它可以正常工作。
我读过好几个地方,你应该返还MarkupExtension
本身如果TargetObject
是Setter
允许一旦它被应用于实际FrameworkElement
,这是有道理的它reeavaluate。
- Markup Extension in Data Trigger
- Huge limitation of a MarkupExtension
- A base class for custom WPF binding markup extensions(在评论)
但是,只有当TargetProperty
是object
类型的作品,否则异常又回来了。如果你看看BindingBase
的源代码,你可以看到它确实做到了这一点,但它看起来框架有一些秘密成分,使它工作。
Hey H.B.是的,我也读过,但是我希望还是有办法的。这是一个非常糟糕的消息,自定义的'MarkupExtensions'似乎是一个半工作的概念。如果TargetProperty不是'object'类型,那么它们就不能用在'Style'' Setter'中,所以我希望通过将它自己应用于一个附加的行为来解决这个问题,但是有了这个计划。无论如何,感谢您的回答 –
@Meleak:呃,正如名字所说的MarkupExtensions扩展标记,它们并不真正用于代码中。顺便说一下,我无法在Setters中使用MarkupExtensions时产生任何问题。 –
我同意,这是比名称更隐含的,只是仍然希望有一种方式:)我的评论并不是很清楚,问题是当你给一个'Setter'提供一个'Binding'值。你已经回答了问题,我接受你的回答。添加了一些细节,为什么我想在我的问题中做到这一点 –