Caliburn.Micro in questo momento (1.3.1) in realtà non supporta queste convenzioni "multiple" per lo stesso FrameworkElement
, quello che hai descritto.
EDIT:
Tuttavia è possibile collegare al metodo ViewModelBinder.BindProperties
e non c'è possibile implementare il proprio convetion supplementare.
sono andato un passo avanti e implementato un prototipo che funziona, ma non è robusto, nè elegante e probabilmente non il modo corretto per fare questo. Ma può essere un punto di partenza:
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);
};
}
sembra un relativamente indolore modo per ottenere il risultato finale che voglio - anche se sono davvero sorpreso che Caliburn Micro non abbia un supporto esplicito per questo genere di cose, poiché avere legature per 'IsEnabled' e' IsReadOnly' è piuttosto comune in un'interfaccia utente. [Ho assunto che il mio GoogleFu era in errore quando non riuscivo a trovare una risposta da solo.] – Bevan
Ho aggiornato la mia soluzione perché l'originale ha ucciso le convenzioni di default :) Ora funziona anche con il tuo campione ' ' Bindings: Text-> Property: 'Name' e IsEnabled -> Property' NameEnabled'. –
nemesv
@juanagui grazie per l'aggiornamento. Non sapevo che l'API fosse cambiata con la versione 1.3.1 – nemesv