wpf - 绑定(bind)为资源

标签 wpf xaml wpf-controls resourcedictionary

我可以将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/

相关文章:

c# - WPF DataGrid SelectionChanged 和按钮单击

wpf - 使用ImageBrush的网格背景图像

.net - WPF 绑定(bind) - 如何确定对象无效以防止保存

c# - WPF 应用程序中的音频截断

wpf - 以编程方式获取视频的 FPS 的任何方法?

c# - 如何在 ListView 中显示实际图像而不是其位置?

WPF:在执行操作之前等待 Storyboard动画完成的正确方法是什么

c# - WPF (.NET 4) 中是否有 TimePicker 控件?

wpf - 如何在Wpf中打印预览?

c# - 处理从外部应用程序打开的文件以加载 WPF 应用程序?