Добавление соглашения для IsEnabled в Caliburn.Micro - PullRequest
6 голосов
/ 28 января 2012

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

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

Ответы [ 2 ]

12 голосов
/ 28 января 2012

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

РЕДАКТИРОВАТЬ :

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

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

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 голосов
/ 30 мая 2013

Вы можете включить / отключить элемент управления, установив логическое свойство в 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);
        }
    }
...