Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Wpf 在xaml中将多绑定放在一行上_Wpf_Xml_Xaml_Binding_Multibinding - Fatal编程技术网

Wpf 在xaml中将多绑定放在一行上

Wpf 在xaml中将多绑定放在一行上,wpf,xml,xaml,binding,multibinding,Wpf,Xml,Xaml,Binding,Multibinding,有没有一种方法可以执行此多重绑定: <TextBox.IsEnabled> <MultiBinding Converter="{StaticResource LogicConverter}"> <Binding ElementName="prog0_used" Path="IsEnabled" /> <Binding ElementName="prog0_used" Path="IsChecked" />

有没有一种方法可以执行此多重绑定:

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

并且put都在一行上,就像在
中一样

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

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

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


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

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

公共类多重绑定:System.Windows.Data.MultiBinding
{
公共多绑定(BindingBase b1、BindingBase b2)
{
添加(b1);
Bindings.Add(b2);
}
公共多绑定(BindingBase b1、BindingBase b2、BindingBase b3)
{
添加(b1);
Bindings.Add(b2);
Bindings.Add(b3);
}
//如果需要,请添加更多构造函数。
}
用法:

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

我试着使用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}}">


我不相信这是可能的,但我很想知道。直接将其绑定到与自定义转换器prog0_一起使用的prog0_used-to-boolean?删除注释并创建新答案。可以使用params关键字使用一个构造函数来完成:
公共多绑定(params bindings base[]bindings)
这是一个很好的解决方案!并绕过内置多绑定的xaml问题。谢谢,我想完成这项工作,因为我有太多的控件需要对多个布尔值作出反应,但我的控件不起作用: