Caliburn.Micro en este momento (1.3.1) realmente no es compatible con esta "múltiples" convenciones para el mismo FrameworkElement
, lo que usted ha descrito.
EDITAR:
Sin embargo se puede enganchar en el método ViewModelBinder.BindProperties
y allí se puede implementar su propio Convetion adicional.
Me dio un paso más e implementado un prototipo que funciona, pero no es robusta, ni elegante y probablemente no es la forma correcta de hacer esto. Pero puede ser un punto de partida:
static AppBootstrapper()
{
ConventionManager.AddElementConvention<FrameworkElement>(
UIElement.IsEnabledProperty,
"IsEnabled",
"IsEnabledChanged");
var baseBindProperties = ViewModelBinder.BindProperties;
ViewModelBinder.BindProperties =
(frameWorkElements, viewModels) =>
{
foreach (var frameworkElement in frameWorkElements)
{
var propertyName = frameworkElement.Name + "Enabled";
var property = viewModels
.GetPropertyCaseInsensitive(propertyName);
if (property != null)
{
var convention = ConventionManager
.GetElementConvention(typeof(FrameworkElement));
ConventionManager.SetBindingWithoutBindingOverwrite(
viewModels,
propertyName,
property,
frameworkElement,
convention,
convention.GetBindableProperty(frameworkElement));
}
}
return baseBindProperties(frameWorkElements, viewModels);
};
}
parece una relativamente sin dolor forma de lograr el resultado final que quiero, aunque estoy realmente sorprendido de que Caliburn Micro no tenga soporte explícito para este tipo de cosas, ya que tener enlaces para 'IsEnabled' y' IsReadOnly' es bastante común en una UI. [Asumí que mi GoogleFu tuvo la culpa cuando no pude encontrar la respuesta yo mismo.] – Bevan
He actualizado mi solución porque la original eliminó las convenciones predeterminadas :) Ahora funciona también con su muestra ' ' Vinculaciones: Texto-> Propiedad: 'Nombre' e IsEnabled -> Propiedad' NameEnabled'. –
nemesv
@juanagui gracias por la actualización. No sabía que la API cambió con la versión 1.3.1 – nemesv