将IsEnabled的约定添加到Caliburn.Micro

Bev*_*van 6 wpf caliburn.micro isenabled

如何添加自定义的公约Caliburn.Micro的IsEnabled控件属性-像已经NameEnabled绑定到IsEnabled并行Name绑定到Text一个文本框.

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

nem*_*esv 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);
       };
}
Run Code Online (Sandbox Code Playgroud)