windows-phone-8 naming-conventions caliburn.micro

windows phone 8 - cómo agregar una convención personalizada para caliburn.micro?



windows-phone-8 naming-conventions (1)

En mi proyecto, necesito una visibilidad vinculante del elemento ui a una propiedad bool, ya que sabes que caliburn.micro tiene la convención "CanName", así que creo que debo agregar mi propia convención personalizada. luego encontré esto [Visibility Autobinding con la convención de nomenclatura, agregué este código en mi proyecto, pero no funciona, y la convención "CanName" tampoco funciona.

ConventionManager.AddElementConvention<FrameworkElement>(Control.VisibilityProperty, "Visibility", "IsVisible"); var baseBindProperties = ViewModelBinder.BindProperties; ViewModelBinder.BindProperties = (frameWorkElements, viewModel) => { BindVisiblityProperties(frameWorkElements, viewModel); return baseBindProperties(frameWorkElements, viewModel); }; static void BindVisiblityProperties(IEnumerable<FrameworkElement> items, Type viewModel) { foreach (FrameworkElement element in items) { string PropertyName = element.Name + "IsVisible"; var property = viewModel.GetPropertyCaseInsensitive(PropertyName); if (property != null) { var convention = ConventionManager.GetElementConvention(typeof(FrameworkElement)); ConventionManager.SetBindingWithoutBindingOverwrite(viewModel, PropertyName, property, element, convention, convention.GetBindableProperty(element)); } } }

Alguien sabe lo que está mal con este código?


Estoy usando esta Convención en mi proyecto sin ningún problema. Aquí hay un tutorial:

En AppBootstrapper.cs incluye la Convención de elementos entre otras convenciones dadas

private static void AddCustomConventions() { ConventionManager.AddElementConvention<FrameworkElement>(Control.VisibilityProperty, "Visibility", "IsVisible"); var baseBindProperties = ViewModelBinder.BindProperties; ViewModelBinder.BindProperties = (frameWorkElements, viewModel) => { BindVisiblityProperties(frameWorkElements, viewModel); return baseBindProperties(frameWorkElements, viewModel); }; }

y su método de ayuda:

private static void BindVisiblityProperties(IEnumerable<FrameworkElement> items, Type viewModel) { foreach (FrameworkElement element in items) { string PropertyName = element.Name + "IsVisible"; var property = viewModel.GetPropertyCaseInsensitive(PropertyName); if (property != null) { var convention = ConventionManager.GetElementConvention(typeof(FrameworkElement)); ConventionManager.SetBindingWithoutBindingOverwrite( viewModel, PropertyName, property, element, convention, convention.GetBindableProperty(element)); } } }

En su PageView.xaml coloca sus Controles y proporciona una x:Name

<StackPanel Orientation="Horizontal" HorizontalAlignment="Center"> <Button x:Name="StartRecord">start</Button> <Button x:Name="StopRecord">stop</Button> <Button x:Name="Foo">foo</Button> <Button x:Name="Bar">bar</Button> </StackPanel>

dentro de su PageViewModel.cs usted coloca una public property de tipo bool con el sufijo IsVisible

public bool FooIsVisible { get { return true; } } public bool BarIsVisible { get { return false; } }