如何IsEnabled
为控件的属性向 Caliburn.Micro 添加自定义约定 - 例如在 TextBox 上并行绑定到NameEnabled
绑定到。IsEnabled
Name
Text
在某种程度上,我想要实现的类似于CanSave
可以使用属性来启用/禁用绑定到Save
方法的按钮的方式,但对于所有控件都是通用的。
如何IsEnabled
为控件的属性向 Caliburn.Micro 添加自定义约定 - 例如在 TextBox 上并行绑定到NameEnabled
绑定到。IsEnabled
Name
Text
在某种程度上,我想要实现的类似于CanSave
可以使用属性来启用/禁用绑定到Save
方法的按钮的方式,但对于所有控件都是通用的。
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);
};
}
您可以通过在 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);
}
}