2012-01-28 4 views
6

Как добавить пользовательское соглашение в Caliburn.Micro для IsEnabled свойства управления - что-то вроде имеющих NameEnabled обязаны IsEnabled параллельно Name связанных с Text на TextBox.Добавление конвенции о IsEnabled к Caliburn.Micro

В некотором роде, то, что я хочу достичь, аналогично тому, как свойство CanSave можно использовать для включения/выключения кнопки, связанной с методом Save, но общим для всех элементов управления.

ответ

12

Caliburn.Micro прямо сейчас (1.3.1) на самом деле не поддерживает эти «множественные» соглашения для того же FrameworkElement, что вы описали.

EDIT:

Однако вы можете подключить в метод ViewModelBinder.BindProperties и там вы можете реализовать свой собственный дополнительный convetion.

Я пошел один шаг дальше и реализован прототип, который работает, но это не надежный, ни элегантная и, вероятно, не правильный путь, чтобы сделать это. Но это может быть отправной точкой:

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

Похоже относительно безболезненно способ достичь конечного результата, которого я хочу - хотя я действительно удивлен тем, что Caliburn Micro не имеет явной поддержки такого рода вещей, поскольку наличие привязок для 'IsEnabled' и' IsReadOnly' довольно распространено в пользовательском интерфейсе. [Я предположил, что мой GoogleFu был виноват, когда я не смог найти ответ сам.] – Bevan

+1

Я обновил свое решение, потому что оригинал убил соглашения по умолчанию :) Теперь он также работает с вашим примером '' Bindings: Text-> Свойство: 'Name' и IsEnabled -> Свойство' NameEnabled'. – nemesv

+0

@juanagui благодарит за обновление. Я не знал, что API изменился с версией 1.3.1 – nemesv

-4

Вы можете включить/отключить управление установкой булево свойство в вашем ViewModel и просто связываться с IsEnabled в XAML:

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

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

Конечно, но если бы я хотел вручную настроить все мои я бы не использовал Caliburn.Micro в первую очередь. – Bevan