binding naming-conventions caliburn.micro

binding - Visibilidad automática con convención de nomenclatura.



naming-conventions caliburn.micro (2)

Podría usar este enfoque si quisiera, es perfectamente razonable. Otro enfoque es utilizar un borde con el mismo nombre que una propiedad booleana en su modelo de vista. Caliburn.Micro establecerá la visibilidad del borde en función del valor de la propiedad booleana.

<Border x:Name="ControlIsVisible"> <TextBox x:Name="MyControl" ... /> </Border>

Realmente me gusta Caliburn y el enlace de la convención de nombres y me sorprendió que la Visibilidad no esté limitada de la misma manera que la Convención "CanNAME" se usa para proteger una Acción. Por lo que sé, el convertidor BooleanToVisibility solo se usa cuando el Binding se usa explícitamente en Caliburn y no como el método de protección. Así que estaba pensando en modificar la fuente para enlazar automáticamente a "bool? ControlNameIsVisible ()" (nulo es igual a colapso) o similar. Me preguntaba si ese es el enfoque correcto y si alguien ya ha hecho la implementación y podría compartirla aquí.


Si desea una solución general, esto es con lo que terminé, basado en: Agregar una convención para IsEnabled a Caliburn.Micro

Tenga en cuenta la anulación de BindActions y BindProperties para que pueda comprobar la visibilidad de las cosas que tienen acciones vinculadas a ellos.

protected override void Configure() { base.Configure(); ConventionManager.AddElementConvention<UIElement>(UIElement.VisibilityProperty, "Visibility", "VisibilityChanged"); var baseBindProperties = ViewModelBinder.BindProperties; ViewModelBinder.BindProperties = (frameWorkElements, viewModel) => { BindVisiblityProperties(frameWorkElements, viewModel); return baseBindProperties(frameWorkElements, viewModel); }; // Need to override BindActions as well, as it''s called first and filters out anything it binds to before // BindProperties is called. var baseBindActions = ViewModelBinder.BindActions; ViewModelBinder.BindActions = (frameWorkElements, viewModel) => { BindVisiblityProperties(frameWorkElements, viewModel); return baseBindActions(frameWorkElements, viewModel); }; } void BindVisiblityProperties(IEnumerable<FrameworkElement> frameWorkElements, Type viewModel) { foreach (var frameworkElement in frameWorkElements) { var propertyName = frameworkElement.Name + "IsVisible"; var property = viewModel.GetPropertyCaseInsensitive(propertyName); if (property != null) { var convention = ConventionManager .GetElementConvention(typeof(FrameworkElement)); ConventionManager.SetBindingWithoutBindingOverwrite( viewModel, propertyName, property, frameworkElement, convention, convention.GetBindableProperty(frameworkElement)); } } }