wpf xml xaml binding multibinding

wpf - poner multibinding en una sola línea en xaml



xml (4)

¿Hay alguna forma de tomar esta multiburación?

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

y put es todo en una línea, como en <TextBox IsEnabled="" /> ?

Si es así, ¿dónde puedo aprender las reglas de este formato?


Un enfoque mejor (y más simple) sería definir un estilo como un recurso que puede aplicar fácilmente a cualquier 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>


Para MultiBinding no hay una cadena de taquigrafía. Necesita usar la sintaxis del elemento expandido.


Esto se puede hacer con una extensión de marcado personalizada:

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

Uso:

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


Intenté usar la respuesta de Discord, pero no funcionó de la caja. Para que funcione, agregué un nuevo 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; } }

El uso será así:

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