我可以将Binding
定义为Resource
,然后将其与不同的Controls
属性一起重用吗?
示例:
绑定(bind):
<Window.Resources>
<Binding x:Key="MyBinding" Path="MyProperty" Mode="TwoWay" />
</Window.Resources>
在 XAML 中重用:
<TextBox Text="{StaticResource MyBinding}" />
按照上面的方式声明 Binding
后,我收到错误:
"The name 'InitializeComponent' does not exist in the current context"
有没有办法在不同的上下文中重用相同的Binding
?
最佳答案
对您问题的直接回答是“是的,您可以将绑定(bind)定义为资源”。这里的问题是你如何利用它?一种可能性是创建一个扩展类,该扩展类将从资源中提取绑定(bind)并应用它:
public class BindingResourceExtension : StaticResourceExtension
{
public BindingResourceExtension() : base() { }
public BindingResourceExtension(object resourceKey) : base(resourceKey) { }
public override object ProvideValue(IServiceProvider serviceProvider)
{
var binding = base.ProvideValue(serviceProvider) as BindingBase;
if (binding != null)
return binding.ProvideValue(serviceProvider);
else
return null; //or throw an exception
}
}
使用示例:
<Window.Resources>
<ResourceDictionary>
<Binding x:Key="MyBinding" Path="MyProperty" Mode="TwoWay" />
</ResourceDictionary>
</Window.Resources>
(...)
<TextBox Text="{ns:BindingResource MyBinding}" />
此解决方案可以用于 MultiBinding
吗?
是的,它可以:
<TextBlock>
<TextBlock.Text>
<MultiBinding StringFormat="First: {0}, Second: {1}">
<Binding Path="SomeProperty" />
<ns:BindingResource ResourceKey="MyBinding" />
</MultiBinding>
</TextBlock.Text>
</TextBlock>
然而,这样做有一个缺点 - 尽管一切都可以在运行时运行,但是XAML设计器会提示BindingResourceExtension
不是正确的类型。 MultiBinding.Bindings
集合。但是,值得庆幸的是,有一个快速的解决方案 - 只需使用 StaticResourceExtension
即可!因此,虽然在运行时功能相同,但设计者会接受:
<TextBlock>
<TextBlock.Text>
<MultiBinding StringFormat="First: {0}, Second: {1}">
<Binding Path="SomeProperty" />
<StaticResource ResourceKey="MyBinding" />
</MultiBinding>
</TextBlock.Text>
</TextBlock>
关于wpf - 绑定(bind)为资源,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36912216/