2012-01-28 8 views
6

Jak dodać niestandardową konwencję do Caliburn.Micro dla właściwości kontroli IsEnabled - coś jakby NameEnabled związany IsEnabled równolegle do Name związany Text na TextBox.Dodawanie konwencję dla IsEnabled do Caliburn.Micro

W pewnym sensie to, co chcę osiągnąć, jest podobne do sposobu, w jaki właściwość CanSave może być używana do włączania/wyłączania przycisku związanego z metodą Save, ale generyczna dla wszystkich elementów sterujących.

Odpowiedz

12

Caliburn.Micro w tej chwili (1.3.1) tak naprawdę nie obsługuje tych "wielu" konwencji dla tego samego FrameworkElement, co opisałeś.

EDIT:

Jednak można podłączyć do metody ViewModelBinder.BindProperties i tam można zaimplementować własną dodatkową convetion.

poszedłem krok dalej i wdrożony prototyp, który działa, ale to nie jest solidna, ani elegancki i prawdopodobnie nie poprawny sposób to zrobić. Ale może to być punkt wyjścia:

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

wydaje się stosunkowo bezbolesne sposób, aby osiągnąć końcowy rezultat, jakiego potrzebuję - choć jestem naprawdę zaskoczony, że Caliburn Micro nie ma wyraźnego wsparcia dla tego rodzaju rzeczy, ponieważ posiadanie powiązań dla 'IsEnabled' i' IsReadOnly' jest dość powszechne w interfejsie użytkownika. [Zakładam, że mój GoogleFu zawinił, gdy sam nie mogłem znaleźć odpowiedzi.] – Bevan

+1

Zaktualizowałem moje rozwiązanie, ponieważ oryginalny zabił domyślne konwencje :) Teraz działa również z twoją próbką '' Wiązania: Tekst-> Właściwość: 'Nazwa' i IsEnabled -> Właściwość' NameEnabled'. – nemesv

+0

@juanagui dzięki za aktualizację. Nie wiedziałem, że interfejs API zmienił się z wersją 1.3.1 – nemesv

-4

można włączyć/wyłączyć kontrolę poprzez ustawienie właściwości Boolean w ViewModel i po prostu wiązać IsEnabled w XAML:

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

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

Oczywiście, ale gdybym chciał ręcznie ustawić wszystkie moje Wiązanie W pierwszej kolejności nie używałbym Caliburn.Micro. – Bevan

Powiązane problemy