c# - XAML Enlace al opuesto de otro elemento
data-binding c#-4.0 (2)
Estoy desarrollando un ejercicio simple y quiero saber si existe una forma de vincular lo opuesto a otro elemento utilizando solo XAML. Por ejemplo. Tengo dos botones en un formulario, Iniciar y Detener tal vez por un temporizador. No quiero que ambos estén habilitados al mismo tiempo. Cuando se inicia el programa, el botón de detención debe deshabilitarse. Cuando se hace clic en el botón de inicio, debe deshabilitarse y el botón de detener habilitado. Luego, viceversa, hasta que el usuario se vaya.
Sé que hay mejores controles para exactamente esto, y sé que es fácil de hacer en código. Solo quería saber si hay algún tipo de operador NOT en XAML que podría verse así:
<Button Content="_Start" Name="btnStart"/>
<Button Content="_Stop" Name="btnStop"
IsEnabled="{Binding ElementName=btnStart,
Path=Not(IsEnabled)}"/>
O algo así como:
Path != IsEnabled}"/>
O incluso algo como:
Path=IsEnabled.Not()}"/>
Sé que puedo vincularme directamente al botón de inicio, pero cuando uno está habilitado también lo está el otro, y también cuando está desactivado. Ver de dónde vengo.
Incluso estaría dispuesto a entretener algún tipo de validación XAML thehnique que primero verificará el estado del botón de inicio y forzará el estado del stop one para que sea el opuesto. O cualquier otro truco o solución alternativa que no requiera código subyacente.
gracias por cualquier ayuda en esto.
EDICIONES: Recuerde que el punto clave para esto es NO código detrás. Si tengo que escribir una sola línea de código, también podría usar el controlador de eventos onclick y un operador simple:. Así que solo quiero algo que funcione directamente en XAML.
No hay una operación Not
fuera de la caja. Sin embargo, es bastante fácil lograr esto usted mismo usando un convertidor personalizado:
public class NotConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
return !(bool) value;
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
return !(bool)value;
}
}
Luego puede especificarlo como un convertidor en su enlace.
<Button Content="_Stop" Name="btnStop"
IsEnabled="{Binding ElementName=btnStart, Converter={StaticResource NotConverter} Path=IsEnabled}"/>
Y finalmente crea un recurso en tu ventana / página llamada NotConverter:
<Window.Resources>
<ns:NotConverter x:Key="NotConverter" />
</Window.Resources>
Puede obtener más información sobre IValueConverter
de MSDN .
Luego use puede utilizar este convertidor de valor en cualquier lugar que desee. Puede sacarlo de los recursos de la ventana y convertirlo en un recurso de nivel de aplicación para que no tenga que especificarlo en cada ventana.
Si lo sé en ese momento, no puede vincularse a! Propiedad, pero puede Escribir un IValueConverter y usarlo en su enlace. Y aquí se explica en detalle cómo puede configurar un IValueConverter que devuelve un valor booleano negado.