在XAML中将多个绑定放在一行上

25

有没有一种方法可以使用这个多绑定:

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

如果是这样,我要怎么把它放在一行里呢?例如:<TextBox IsEnabled="" />

如果是的话,我应该去哪里学习这种格式的规则呢?


我不相信这是可能的,但我很想知道。 - womp
将其直接绑定到 prog0_used,并使用您的自定义转换器 prog0_used-to-boolean。 - DK.
4个回答

24

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

<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>

8
这可以通过自定义标记扩展来完成:
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}}">

删除了注释并创建了一个新答案。 - Christian Myksvoll
可以使用params关键字在一个构造函数中完成:public MultiBinding (params BindingBase[] bindings) - BalintPogatsa
这是一个很棒的解决方案!并且避开了内置Multibinding的XAML问题。感谢您提供这个。 - mike gold
@BalintPogatsa 那也是我的第一个想法,但是 params 关键字在这里似乎不起作用 - 编译失败并显示错误消息 **error MC3009: 找不到接受 2 个参数的 'MultiBinding' 的公共构造函数。**。你是否成功使用这种方法?如果是的话,你是如何做到的? - radj307

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}}">

我想完成这个任务,因为我有很多控件需要对多个布尔值做出反应,但我的代码没有按预期工作:http://stackoverflow.com/questions/37057720/inline-multibinding-not-working-as-expected - Chris Fannin

4
对于MultiBinding,没有简写的字符串。您需要使用扩展元素语法。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接