2011-07-09 12 views
16

Me gusta mucho Caliburn y el enlace de la convención de nomenclatura y me sorprendió que Visibilidad no esté vinculado de la misma forma que se utiliza el Convenio "CanNAME" para proteger una Acción. Por lo que sé, BooleanToVisibilityConverter solo se usa cuando Binding se usa explícitamente en Caliburn y no automáticamente como el método de guard. Así que estaba pensando en modificar la fuente para enlazar automáticamente a "bool? ControlNameIsVisible()" (null es igual a colapsar) o similar. Me preguntaba si ese es el enfoque correcto y, de ser así, si alguien ya ha hecho la implementación y podría compartirla aquí.Visibilidad Autobinding con la convención de nomenclatura

Respuesta

17

Se podría utilizar este método si quería, que es perfectamente razonable. Otro enfoque es usar un borde con el mismo nombre que una propiedad booleana en su modelo de vista. Caliburn.Micro configurará la visibilidad del borde en función del valor de la propiedad booleana.

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

Nicely done. Puede que no sea la solución "correcta" para todas las instancias, pero este es un gran consejo. – IAmTimCorey

+0

Para aquellos que no desean agregar control adicional en la interfaz de usuario, puede vincular la visibilidad directamente a la propiedad. Esto no se enlaza por convención, pero el código que toma es aproximadamente el mismo que el anterior, y sin control adicional para envolver. – liang

+0

¿Tiene algún ejemplo? –

9

Si desea una solución general, esto es lo que terminó con base en: Adding a convention for IsEnabled to Caliburn.Micro

Nota del primordial de BindActions, así como 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)); 
      } 
     } 
    } 
+1

Tenga en cuenta que esto no funciona para el enlace de propiedad profundo de Caliburn.Micro (por ejemplo, Person_ControlName). – Govert

+0

Esto funciona maravillosamente con ToolBars. Puedo mostrar/ocultar barras de herramientas completas en una ToolBarTray de la misma manera que puedo activar/desactivar elementos individuales en una barra de herramientas. ¡Muy agradable! Hasta ahora, no hay problemas. Cuanto más uso Caliburn.Micro, menos Visual Studio parece mágico. – metaomniliquant

Cuestiones relacionadas