Porque se desaparecen bindings en XAML C#

Basicamente los binding’s desaparecen porque alguien los borra de alguna manera. Y como programadores normalmente no lo hacen, piensan que los binding’s de las propiedades siempre deben funcionar y siempre estan presentes, lo que no es verdad. Y hay un caso bastante facil de ver, pero complicado de entender que esta pasando.

Yo me encontre con la situación que despues de ver un CheckBox marcado gracias al binding, luego se queda marcado siempre y no me cambia el valor aún que se cambia el Context. Si el binding estaria funcionando, todo seria perfecto, pero no funcionaba. Al principio he pensado que problema esta con Mode=TwoWay/OneWay/etc, luego con posible problema de “UpdateTrigger” de la propiedad mostrada y en parte es correcto, pero el Binding en si, dejaba de existir asociado a propiedad “IsChecked”.

Para ver si existe binding podeis utilizar el codigo:

BindingExpression be = cbIsClient.GetBindingExpression(ToggleButton.IsCheckedProperty);

Si “be” es igual a “null”, no existe “binding” en esta propiedad.
Asi que si os deja de funcionar, en diferentes partes de codigo podeis ir detectando en que momento acaba desapareciendo. Gracias a esta investigación bastante manual vi un error mio que yo nunca consideraba que podria ser un error.

Imaginar el caso que tenemos un objeto “Coche” con una propiedad “Cliente”, la cual a su vez es un objeto. En pantalla con XAML dibujamos un CheckBox que tiene que estar marcado cuando “Coche.Cliente != null” y desmarcado cuando propiedad es nula. Se puede utilizar “Converter” personalizado para solventar este problema, pero necesitamos que salta el trigger si se cambia la propiedad “Coche.Cliente”. Si no lo podemos hacer de una forma facil por codigo, al no tener acceso a la propiedad “Cliente” (por ejemplo es de una libreria externa), yo pense que podria hacer simplemente:

cbIsClient.IsChecked = Coche.Cliente != null;

Y cuando pasa por esta parte de codigo se marca o se desmarca correctamente. El problema lo vi luego, al cambiar de un objeto “Coche” a otro de la lista. Vi que por si solo el CheckBox queda con el valor anterior si no fuerzo pasar por la linea de asignación directa y esto teniendo en CheckBox un binding con un converter.

Despues de investigar vi que el problema esta, en que al cargar primer “Coche” si que funcionaba el “binding” pero luego al pasar por “cbIsClient.IsChecked = Coche.Cliente != null;” lo que sucede, es que XAML piensa que apartir de ahora asignación sera manual y borra el binding. Asi luego si comprobamos con “GetBindingExpression” veremos que no hay ningun binding.

Sabiendo esto ya podeis encontrar solución, en mi caso al trabajar en codigo tube que crear algo asi:

coche.Cliente = new Client("123456789");
BindingExpression be = cbIsClient.GetBindingExpression(ToggleButton.IsCheckedProperty);
be?.UpdateTarget();

Mi problema era que no podria acceder a la propiedad y no me saltaba trigger, asi que sin asignar directamente al control, lo que hacia es forzar el disparo del binding del control despues de cambiar el valor por el codigo.

Propiedades generales y de permisos de Usuario en XAML del DataGrid (WPF C#)

Las propiedades mas habituales del DataGrid en XAML y las propiedades para limitar o habilitar acciones de usuario

Margin="10,10,10,10"
HorizontalAlignment="Stretch"
VerticalAlignment="Stretch"
CanUserSortColumns="True"
CanUserAddRows="False"
CanUserDeleteRows="False"
CanUserReorderColumns="False"
CanUserResizeColumns="True"
CanUserResizeRows="False"