no he encontrado una manera particularmente fácil de usar para incrustar una expresión en XAML, así que esto es lo que he estado usando en su lugar:
BindingOperations.SetBinding(myBtn, Button.IsEnabledProperty, LambdaBinding.New(
new Binding { Source = myObject,
Path = new PropertyPath(ComboBox.SelectedIndexProperty) },
(int selectedIndex) => selectedIndex >= 0
));
Tendrá que escribir esto en C#, por ejemplo, en el constructor de la ventana.
Esto también funciona a la perfección para los enlaces de múltiples fuentes:
BindingOperations.SetBinding(myBtn, Button.IsEnabledProperty, LambdaBinding.New(
new Binding { Source = myObject,
Path = new PropertyPath(ComboBox.SelectedIndexProperty) },
new Binding { Source = myObject2,
Path = new PropertyPath(Button.ActualHeightProperty) },
(int selectedIndex, double height) => selectedIndex >= 0 && height > 10.5
));
observar que la lambda se escribe de forma estática, y cualquier error de tipo son (relativamente) ruidosa, ayudando a realizar un seguimiento de ellos hacia abajo. El tipo de retorno lambda también se tiene en cuenta; puede usar esto para vincular el ancho de un objeto para que sea una fórmula compleja basada en el ancho de otro ...
Esta clase LambdaBinding
no está incorporada; debe incluir el archivo LambdaBinding.cs.
Nota al pie. Es una verdadera lástima que XAML no permita expresiones. Sí, me doy cuenta de que XAML se supone que es "para diseñadores" y sin esta cosa esquiva que llamamos lógica de aplicación , pero ¿a quién estamos engañando aquí ... Primero, el DataTrigger
que se muestra en la otra respuesta es básicamente una expresión condicional, y por eso no diferente (solo mucho más tiempo) que {Binding source.SelectedIndex >= 0}
. En segundo lugar, si la idea es simplicidad, entonces las expresiones vinculantes que se supone que un diseñador puede escribir están más allá de las capacidades de un programador no profesional ... si necesita pruebas, considere algo como esto:
{Binding RelativeSource={RelativeSource AncestorType={x:Type UIElement},
AncestorLevel=1},
Path=IsEnabled}
Gracias, puedo usarlo para uno de mis botones, pero el otro sería donde SelectedIndex> = 1. ¿Puedo hacer eso como su ejemplo anterior pero solo con un MultiDataTrigger? –
MultiDataTrigger se usa cuando las condiciones se combinan juntas. Para hacer SelectedIndex> = 1, copie el activador de datos para '-1' y cambie el valor de activación a '0'. –