6

如何IsEnabled为控件的属性向 Caliburn.Micro 添加自定义约定 - 例如在 TextBox 上并行绑定到NameEnabled绑定到。IsEnabledNameText

在某种程度上,我想要实现的类似于CanSave可以使用属性来启用/禁用绑定到Save方法的按钮的方式,但对于所有控件都是通用的。

4

2 回答 2

14

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);
       };
}
于 2012-01-28T16:09:32.360 回答
-3

您可以通过在 ViewModel 中设置布尔属性来启用/禁用控件,并且只需绑定到 XAML 中的 IsEnabled:

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

ViewModel:
   private bool isReadOnly;
    public bool IsReadOnly
    {
        get { return isReadOnly; }
        set
        {
            this.isReadOnly = value;
            NotifyOfPropertyChange( () => IsReadOnly);
        }
    }
于 2013-05-30T09:47:39.097 回答