绑定为资源

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)