将多重绑定放在 xaml 中的单行上

Posted

技术标签:

【中文标题】将多重绑定放在 xaml 中的单行上【英文标题】:putting multibinding on a single line in xaml 【发布时间】:2011-02-26 22:37:01 【问题描述】:

有没有办法采取这种多重绑定:

<TextBox.IsEnabled>
    <MultiBinding Converter="StaticResource LogicConverter">
        <Binding ElementName="prog0_used" Path="IsEnabled" />
        <Binding ElementName="prog0_used" Path="IsChecked" />
    </MultiBinding>
</TextBox.IsEnabled>

并且 put 都在一行上,如&lt;TextBox IsEnabled="" /&gt;?

如果是这样,我在哪里可以学习这种格式的规则?

【问题讨论】:

我不相信这是可能的,但我很想知道。 使用您的自定义转换器 prog0_used-to-boolean 将其直接绑定到 prog0_used ? 【参考方案1】:

更好(更简单)的方法是将样式定义为可以轻松应用于任何文本框的资源:

<Window.Resources>
    <c:MyLogicConverter x:Key="LogicConverter" />

    <Style TargetType="x:Type TextBox" BasedOn="StaticResource x:Type TextBox" x:Key="MultiBound">
        <Setter Property="IsEnabled">
            <Setter.Value>
                <MultiBinding Converter="StaticResource LogicConverter">
                    <Binding ElementName="switch" Path="IsEnabled" />
                    <Binding ElementName="switch" Path="IsChecked" />
                </MultiBinding>
            </Setter.Value>
        </Setter>
    </Style>
</Window.Resources>

<StackPanel Orientation="Horizontal">
    <CheckBox Name="switch" />
    <TextBox Name="textBox2" Text="Test" Style="StaticResource MultiBound" />
</StackPanel>

【讨论】:

【参考方案2】:

这可以通过自定义标记扩展来完成:

public class MultiBinding : System.Windows.Data.MultiBinding

    public MultiBinding (BindingBase b1, BindingBase b2)
    
        Bindings.Add(b1);
        Bindings.Add(b2);
    

    public MultiBinding (BindingBase b1, BindingBase b2, BindingBase b3)
    
        Bindings.Add(b1);
        Bindings.Add(b2);
        Bindings.Add(b3);
    

    // Add more constructors if you need.

用法:

<TextBox IsEnabled="local:MultiBinding
    Binding IsEnabled, ElementName=prog0_used,
    Binding IsChecked, ElementName=prog0_used,
    Converter=StaticResource LogicConverter">

【讨论】:

删除评论并创建新答案。 可以使用 params 关键字在一个构造函数中完成:public MultiBinding (params BindingBase[] bindings) 这是一个很好的解决方案!并解决了内置 Multibinding 的 xaml 问题。谢谢你【参考方案3】:

对于 MultiBinding,没有速记字符串。您需要使用扩展元素语法。

【讨论】:

【参考方案4】:

我尝试使用 Discord 的答案,但它不能直接使用。为了让它工作,我添加了一个新的构造函数:

public class MultiBinding : System.Windows.Data.MultiBinding

    public MultiBinding(BindingBase b1, BindingBase b2, object converter)
    
        Bindings.Add(b1);
        Bindings.Add(b2);
        Converter = converter as IMultiValueConverter;
    

然后使用如下:

    <TextBox IsEnabled="local:MultiBinding Binding IsEnabled, ElementName=prog0_used, 
Binding IsChecked, ElementName=prog0_used, 
StaticResource LogicConverter">

【讨论】:

我想完成这个,因为我有很多控件需要对多个布尔值做出反应,但我的行为不正常:***.com/questions/37057720/…

以上是关于将多重绑定放在 xaml 中的单行上的主要内容,如果未能解决你的问题,请参考以下文章

2021-09-15 WPF上位机 17-属性绑定(多重绑定)

将 XAML 中的可见性绑定到可见性属性

Xamarin XAML语言教程控件模板的模板绑定

将 wpf:ComboBox 绑定到 XAML 中的静态类

如何将 ItemsControl.ItemsSource 与 XAML 中的属性绑定?

WPF:写入矩形取决于使用多重绑定的鼠标位置