2012-01-28 14 views
6

¿Cómo agrego una convención costumbre de Caliburn.Micro para la propiedad de los controles IsEnabled - algo así como tener NameEnabled obligado a IsEnabled en paralelo a Name obligado a Text en un cuadro de texto.Adición de una convención para IsEnabled a Caliburn.Micro

En cierto modo, lo que quiero lograr es similar a la forma en que se puede usar una propiedad CanSave para activar/desactivar un botón vinculado a un método Save, pero genérico para todos los controles.

Respuesta

12

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); 
     }; 
} 
+0

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

+1

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

+0

@juanagui gracias por la actualización. No sabía que la API cambió con la versión 1.3.1 – nemesv

-4

puede activar/desactivar un control mediante el establecimiento de una propiedad booleana en su modelo de vista y que acaba de unirse a IsEnabled en XAML:

TextBox Name="SerialNumber" IsEnabled="{Binding IsReadOnly}"... 

ViewModel: 
    private bool isReadOnly; 
    public bool IsReadOnly 
    { 
     get { return isReadOnly; } 
     set 
     { 
      this.isReadOnly = value; 
      NotifyOfPropertyChange(() => IsReadOnly); 
     } 
    } 
+4

Claro, pero si quisiera configurar manualmente todo mi vinculante No utilizaría Caliburn.Micro en primer lugar. – Bevan

Cuestiones relacionadas