Kyl*_*Ren 16 wpf xaml wpf-controls resourcedictionary
我可以将a定义Binding为a Resource然后使用不同的Controls属性重用它吗?
例:
捆绑:
<Window.Resources>
<Binding x:Key="MyBinding" Path="MyProperty" Mode="TwoWay" />
</Window.Resources>
Run Code Online (Sandbox Code Playgroud)
在XAML中重用:
<TextBox Text="{StaticResource MyBinding}" />
Run Code Online (Sandbox Code Playgroud)
在声明Binding如上后我得到了错误:
"当前上下文中不存在名称'InitializeComponent'"
有没有办法Binding在不同的环境中重用相同的东西?
Grx*_*x70 15
直接回答您的问题是"是的,您可以将绑定定义为资源".这里的问题是你如何使用它?一种可能性是创建一个扩展类,它将从资源中提取绑定并应用它:
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
}
}
Run Code Online (Sandbox Code Playgroud)
用法示例:
<Window.Resources>
<ResourceDictionary>
<Binding x:Key="MyBinding" Path="MyProperty" Mode="TwoWay" />
</ResourceDictionary>
</Window.Resources>
(...)
<TextBox Text="{ns:BindingResource MyBinding}" />
Run Code Online (Sandbox Code Playgroud)
这个解决方案可以用于 MultiBinding吗?
是的,它可以:
<TextBlock>
<TextBlock.Text>
<MultiBinding StringFormat="First: {0}, Second: {1}">
<Binding Path="SomeProperty" />
<ns:BindingResource ResourceKey="MyBinding" />
</MultiBinding>
</TextBlock.Text>
</TextBlock>
Run Code Online (Sandbox Code Playgroud)
但是有一个缺点 - 虽然一切都可以在运行时使用,但是XAML Designer会抱怨它BindingResourceExtension不适合放入MultiBinding.Bindings集合中.但是,幸运的是,有一个快速的解决方案 - 只需使用StaticResourceExtension!因此,在运行时功能相同的情况下,设计师将接受:
<TextBlock>
<TextBlock.Text>
<MultiBinding StringFormat="First: {0}, Second: {1}">
<Binding Path="SomeProperty" />
<StaticResource ResourceKey="MyBinding" />
</MultiBinding>
</TextBlock.Text>
</TextBlock>
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5867 次 |
| 最近记录: |