putting multibinding on a single line in xaml
26,409
Solution 1
A better (and simpler) approach would be to define a style as a resource which you can easily apply to any TextBox:
<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>
Solution 2
This can be done with a custom markup extension:
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.
}
Usage:
<TextBox IsEnabled="{local:MultiBinding
{Binding IsEnabled, ElementName=prog0_used},
{Binding IsChecked, ElementName=prog0_used},
Converter={StaticResource LogicConverter}}">
Solution 3
For MultiBinding there is no shorthand string. You need to use the expanded element syntax.
Solution 4
I tried using Discord's answer, but it didn't work right out of the box. To make it work I added a new constructor:
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;
}
}
Usage will then be like this:
<TextBox IsEnabled="{local:MultiBinding {Binding IsEnabled, ElementName=prog0_used},
{Binding IsChecked, ElementName=prog0_used},
{StaticResource LogicConverter}}">
Related videos on Youtube
Author by
Adam S
Updated on June 23, 2020Comments
-
Adam S almost 4 years
Is there a way to take this multibinding:
<TextBox.IsEnabled> <MultiBinding Converter="{StaticResource LogicConverter}"> <Binding ElementName="prog0_used" Path="IsEnabled" /> <Binding ElementName="prog0_used" Path="IsChecked" /> </MultiBinding> </TextBox.IsEnabled>
and put is all on one line, as in
<TextBox IsEnabled="" />
?If so, where can I learn the rules of this formattiong?
-
nuiun almost 14 yearsI don't believe this is possible, but I'm interested to know.
-
DK. almost 14 yearsbind it directly to prog0_used with your custom converter prog0_used-to-boolean ?
-
-
Christian Myksvoll almost 9 yearsRemoved comment and created a new answer.
-
Chris Fannin about 8 yearsI'd like to accomplish this since I have so many controls that need to react to multiple booleans, but mine's not behaving: stackoverflow.com/questions/37057720/…
-
BalintPogatsa about 5 yearsCan be done with one constructor using the params keyword:
public MultiBinding (params BindingBase[] bindings)
-
mike gold over 3 yearsThis is a great solution! And gets around the xaml issues of the built in Multibinding. Thanks for this
-
radj about 2 years@BalintPogatsa That was my first thought as well, but the
params
keyword doesn't appear to work here - compilation fails witherror MC3009: Cannot find a public constructor for 'MultiBinding' that takes 2 arguments.
. Have you gotten it to work with this method; and if so, how?