2012-01-28 13 views
6

Come faccio ad aggiungere una convenzione personalizzata per Caliburn.Micro per la IsEnabled proprietà di controlli - qualcosa come avere NameEnabled destinata a IsEnabled in parallelo Name legato a Text su un TextBox.Aggiunta di una convenzione per IsEnabled a Caliburn.Micro

In un certo senso, ciò che voglio ottenere è simile al modo in cui una proprietà CanSave può essere utilizzata per abilitare/disabilitare un pulsante associato a un metodo Save, ma generico per tutti i controlli.

risposta

12

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

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

+1

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

+0

@juanagui grazie per l'aggiornamento. Non sapevo che l'API fosse cambiata con la versione 1.3.1 – nemesv

-4

È possibile abilitare/disabilitare un controllo impostando una proprietà booleana nel vostro ViewModel e basta legarsi a IsEnabled in XAML:

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

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

Certo, ma se volessi impostare manualmente tutto il mio vincolante non userò Caliburn.Micro in primo luogo. – Bevan