Tengo una enumeración como esta:
public enum MyLovelyEnum
{
FirstSelection,
TheOtherSelection,
YetAnotherOne
};
Tengo una propiedad en mi DataContext:
public MyLovelyEnum VeryLovelyEnum { get; set; }
Y obtuve tres RadioButtons en mi cliente WPF.
<RadioButton Margin="3">First Selection</RadioButton>
<RadioButton Margin="3">The Other Selection</RadioButton>
<RadioButton Margin="3">Yet Another one</RadioButton>
Ahora, ¿cómo enlazo los RadioButtons a la propiedad para un enlace bidireccional adecuado?
Respuestas:
Podrías usar un convertidor más genérico
Y en la XAML-Part usas:
fuente
Puede simplificar aún más la respuesta aceptada. En lugar de escribir las enumeraciones como cadenas en xaml y hacer más trabajo en su convertidor de lo necesario, puede pasar explícitamente el valor de enumeración en lugar de una representación de cadena, y como CrimsonX comentó, los errores se generan en tiempo de compilación en lugar de tiempo de ejecución:
ConverterParameter = {x: Local estático: YourEnumType.Enum1}
Luego simplifica el convertidor:
Editar (16 de diciembre de 2010):
Gracias a anon por sugerir devolver Binding.DoNothing en lugar de DependencyProperty.UnsetValue.Nota - Varios grupos de RadioButtons en el mismo contenedor (17 de febrero de 2011):
En xaml, si los botones de opción comparten el mismo contenedor principal, al seleccionar uno se desmarcarán todos los demás dentro de ese contenedor (incluso si están vinculados a una propiedad diferente). Así que trate de mantener sus RadioButton que están vinculados a una propiedad común agrupados en su propio contenedor como un panel de pila. En los casos en que sus RadioButtons relacionados no puedan compartir un solo contenedor primario, configure la propiedad GroupName de cada RadioButton en un valor común para agruparlos lógicamente.Editar (5 de abril de 2011):
Simplificado ConvertBack's if-else para usar un operador ternario.Nota - Tipo de enumeración anidado en una clase (28 de abril de 2011):
Si su tipo de enumeración está anidado en una clase (en lugar de directamente en el espacio de nombres), puede usar la sintaxis '+' para acceder a la enumeración en XAML como se indica en una respuesta (no marcada) a la pregunta No se puede encontrar tipo de enumeración para referencia estática en WPF :ConverterParameter = {x: Local estático: YourClass + YourNestedEnumType.Enum1}
Sin embargo, debido a este problema de Microsoft Connect , el diseñador en VS2010 ya no cargará la declaración
"Type 'local:YourClass+YourNestedEnumType' was not found."
, pero el proyecto se compila y ejecuta con éxito. Por supuesto, puede evitar este problema si puede mover su tipo de enumeración al espacio de nombres directamente.Editar (27 de enero de 12):
Si usa banderas Enum, el convertidor sería el siguiente:Editar (7 de mayo '15):
En el caso de una enumeración anulable (eso no se hace en la pregunta, pero puede ser necesario en algunos casos, por ejemplo, ORM devuelve nulo de DB o cuando tenga sentido que en la lógica del programa no se proporcione el valor), recuerde agregar una verificación nula inicial en el Método de conversión y devuelve el valor bool apropiado, que generalmente es falso (si no desea que se seleccione ningún botón de radio), como a continuación:Nota - NullReferenceException (10 de octubre de 18):
Se actualizó el ejemplo para eliminar la posibilidad de lanzar una NullReferenceException.IsChecked
es un tipo anulable, por lo que regresarNullable<Boolean>
parece una solución razonable.fuente
Para la respuesta EnumToBooleanConverter: en lugar de devolver DependencyProperty.UnsetValue, considere devolver Binding.DoNothing para el caso en el que el valor del botón de radio IsChecked se convierte en falso. El primero indica un problema (y puede mostrar al usuario un rectángulo rojo o indicadores de validación similares) mientras que el segundo simplemente indica que no se debe hacer nada, que es lo que se desea en ese caso.
http://msdn.microsoft.com/en-us/library/system.windows.data.ivalueconverter.convertback.aspx http://msdn.microsoft.com/en-us/library/system.windows.data.binding .donothing.aspx
fuente
Usaría RadioButtons en un ListBox y luego me vincularía al SelectedValue
Este es un hilo antiguo sobre este tema, pero la idea base debería ser la misma: http://social.msdn.microsoft.com/Forums/en-US/wpf/thread/323d067a-efef-4c9f-8d99-fecf45522395/
fuente
Para UWP, no es tan simple: debe saltar a través de un aro adicional para pasar un valor de campo como parámetro.
Ejemplo 1
Válido tanto para WPF como para UWP.
Ejemplo 2
Válido tanto para WPF como para UWP.
Ejemplo 3
Válido solo para WPF!
UWP no es compatible,
x:Static
por lo que el Ejemplo 3 está fuera de discusión; suponiendo que vaya con el Ejemplo 1 , el resultado es un código más detallado. El ejemplo 2 es ligeramente mejor, pero aún no es ideal.Solución
Luego, para cada tipo que desee admitir, defina un convertidor que incluya el tipo de enumeración.
La razón por la que debe encuadrarse es porque aparentemente no hay forma de hacer referencia al tipo en el
ConvertBack
método; el boxeo se encarga de eso. Si sigue cualquiera de los dos primeros ejemplos, puede hacer referencia al tipo de parámetro, eliminando la necesidad de heredar de una clase en caja; Si desea hacerlo todo en una línea y con la menor verbosidad posible, la última solución es ideal.El uso se asemeja al Ejemplo 2 , pero es, de hecho, menos detallado.
La desventaja es que debe definir un convertidor para cada tipo que desee admitir.
fuente
He creado una nueva clase para manejar RadioButtons y CheckBoxes vinculantes para enumeraciones. Funciona para enumeraciones marcadas (con múltiples selecciones de casillas de verificación) y enumeraciones no marcadas para casillas de verificación de selección única o botones de opción. Tampoco requiere ningún ValueConverters en absoluto.
Esto puede parecer más complicado al principio, sin embargo, una vez que copie esta clase en su proyecto, ya está hecho. Es genérico, por lo que puede reutilizarse fácilmente para cualquier enumeración.
Y para saber cómo usarlo, supongamos que tiene una enumeración para ejecutar una tarea de forma manual o automática, y puede programarse para cualquier día de la semana, y algunas opciones opcionales ...
Ahora, aquí está lo fácil que es usar esta clase:
Y así de fácil es enlazar casillas de verificación y botones de opción con esta clase:
fuente
EnumSelection<StartTask>
objeto. Si observa la definición deEnumSelection<T>
puede ver que tiene una propiedad Value. Por lo tanto, el modelo de vista no necesita tener una "SelectedStartTask". Se podría utilizarStartUp.Value
. Y en cuanto a tener un valor predeterminado de Indefinido, vea la 3ª enumeración, Opciones adicionales, tiene Ninguno en lugar de Indefinido, pero puede cambiar el nombre a lo que desee.Esto también funciona para Checkbox .
Enlace de una sola enumeración a varias casillas de verificación.
fuente
Basado en el EnumToBooleanConverter de Scott. Noté que el método ConvertBack no funciona en Enum con código de banderas.
He intentado el siguiente código:
La única cosa que no puedo ir a trabajar es hacer un molde a partir
int
detargetType
lo que lo hice codificada paraNavigationProjectDates
, la enumeración que yo uso. YtargetType == NavigationProjectDates
...Edite para obtener más convertidores genéricos de Flags Enum:
fuente
Puede crear los botones de radio dinámicamente,
ListBox
puede ayudarlo a hacer eso, sin convertidores, bastante simple.A continuación, se detallan los pasos detallados: cree un ListBox y establezca ItemsSource para el cuadro de lista como la enumeración
MyLovelyEnum
y enlace el SelectedItem del ListBox a laVeryLovelyEnum
propiedad. Luego se crearán los botones de radio para cada elemento ListBox.Control Template
complete cada elemento dentro como botón de radioLa ventaja es la siguiente: si algún día su clase de enumeración cambia, no necesita actualizar la GUI (archivo XAML).
Referencias: https://brianlagunas.com/a-better-way-to-data-bind-enums-in-wpf/
fuente