2012-01-28 2 views
6

Comment puis-je ajouter une convention personnalisée à Caliburn.Micro pour la propriété IsEnabled des contrôles - quelque chose comme ayant NameEnabled lié à IsEnabled en parallèle Name lié à Text sur une zone de texte. En un sens, ce que je veux faire est similaire à la façon dont une propriété CanSave peut être utilisée pour activer/désactiver un bouton lié à une méthode Save, mais générique pour tous les contrôles.Ajout d'une convention pour IsEnabled à Caliburn.Micro

Répondre

12

Caliburn.Micro en ce moment (1.3.1) ne supporte pas vraiment ce "multiple" conventions pour le même FrameworkElement, ce que vous avez décrit.

EDIT:

Cependant, vous pouvez brancher dans la méthode ViewModelBinder.BindProperties et là, vous pouvez mettre en œuvre votre propre Convetion supplémentaire.

Je suis allé un peu plus loin et mis en œuvre un prototype qui fonctionne, mais ce n'est pas robuste, ni élégante et probablement pas la bonne façon de le faire. Mais il peut être un point de départ:

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

On dirait une relativement indolore Je suis vraiment surpris que Caliburn Micro n'ait pas de support explicite pour ce genre de chose, car avoir des liaisons pour 'IsEnabled' et' IsReadOnly' est assez courant dans une interface utilisateur. [J'ai supposé que mon GoogleFu était en faute quand je ne pouvais pas trouver une réponse moi-même.] – Bevan

+1

J'ai mis à jour ma solution parce que l'original a tué les conventions par défaut :) Maintenant cela fonctionne aussi avec votre exemple '' Bindings: Text-> Propriété: 'Name' et IsEnabled -> Propriété' NameEnabled'. – nemesv

+0

@juanagui merci pour la mise à jour. Je ne savais pas que l'API a changé avec la version 1.3.1 – nemesv

-4

Vous pouvez activer/désactiver un contrôle en définissant une propriété booléenne dans votre ViewModel et vous lier juste 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

Bien sûr, mais si je voulais mettre en place manuellement tous mes liant je ne serais pas en utilisant Caliburn.Micro en premier lieu. – Bevan

Questions connexes