none
Consulta SQL en segundo plano RRS feed

  • Pregunta

  • Hola, vengo con un problema. Resulta que tengo una ventana de búsqueda de clientes, con su respectivo viewModel.

    En el .xaml tengo

    <Button Margin="5"
            Visibility="{Binding IsVisibleProgressRing, Converter={StaticResource InvertBoolToVisibilityConverter}, Mode=TwoWay}">
            Content="Search"
    </Button>
    
    <mahApps:ProgressRing Margin="5"
                          Height="32" Width="32"
                          DockPanel.Dock="Right"
                          IsActive="{Binding IsActiveProgressRing, Mode=TwoWay}" 
                          Visibility="{Binding IsVisibleProgressRing, Mode=TwoWay}"/>

    También tengo la clase que cambia el valor de "Visibility"

    public class InvertBoolToVisibilityConverter : IValueConverter
    {
        private readonly BooleanToVisibilityConverter _converter = new BooleanToVisibilityConverter();
    
        public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
        {
            var result = _converter.Convert(value, targetType, parameter, culture) as Visibility?;
            return result == Visibility.Collapsed ? Visibility.Visible : Visibility.Collapsed;
        }
    
        public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
        {
            var result = _converter.ConvertBack(value, targetType, parameter, culture) as bool?;
            return result != true;
        }
    }

    Y en el ViewModel tengo

    try
                {
    
                    IsActiveProgressRing = true;
    
                    IsVisibleProgressRing = Visibility.Visible;
    
                    _empleadosDataAccess = new EmpleadosDataAccess();
    
                    Empleados = new ObservableCollection<Empleado>(_empleadosDataAccess.CoincidenciasDeEmpleados(FiltroDeBusqueda));
    
                    if (!Empleados.Any())
                    {
                        MensajeInformativo("No se encontraron coincidencias que cumplan con las condiciones indicadas.", "¡Atención!");
                        IsFocusedFiltroDeBusqueda = true;
                    }
                    else
                    {
                        if (IsVisibleBtnSeleccionar == Visibility.Visible)
                        {
                            IsDefaultBuscar = false;
                        }
                        else
                        {
                            IsFocusedFiltroDeBusqueda = true;
                        }
                    }
    
                    IsVisibleProgressRing = Visibility.Collapsed;
    
                    IsActiveProgressRing = false;
                    
                }

    Lo que yo quiero es que en el momento que le doy clic al botón buscar, este se esconda (Visibility.Collapsed) y aparezca un ProgressRing y que al terminar la consulta, vuelva el botón y se esconda el ProgressRing. Necesito algo en segundo plano pero esto ya me supero. Gracias!

    viernes, 29 de mayo de 2015 17:17

Respuestas

  • Hola HajimeSaito:

    Para iniciar puedes poner una propiedad en tu ModelView:

    DependencyProperty

            public static readonly DependencyProperty BotonVisibleProperty = DependencyProperty.Register("BotonVisible", typeof(Visibility), typeof(ClassActual));
            public Visibility BotonVisible
            {
                get { return (Visibility)GetValue(BotonVisibleProperty); }
                set { SetValue(BotonVisibleProperty, value); }
            }
    


    Y puedes tener un método asíncrono:

    Métodos asíncronos

    private async void Buscar()
    {
       // Aquí tu código
       BotonVisible = Visibility.Hidden;
       Empleados = await Obtener();
       BotonVisible = Visibility.Visible;
       // Aquí tu código
    }
    
    private Task<ObservableCollection<Empleado>> Obtener()
    {
       return Task.Run(() =>
       {
          using (EmpleadosDataAccess _empleadosDataAccess = new EmpleadosDataAccess())
          {
             return _empleadosDataAccess.CoincidenciasDeEmpleados(FiltroDeBusqueda));
          }
       });
    }
    

    Desconozco la totalidad de tu contexto, pero espero te sirva de guía el código que te proporciono.

    Considera que EmpleadosDataAccess tiene que implementar IDisposable, para no tener conflicto con el using;

    Saludos...

    • Marcado como respuesta HajimeSaito lunes, 1 de junio de 2015 22:35
    sábado, 30 de mayo de 2015 0:33

Todas las respuestas

  • Hola HajimeSaito:

    Para iniciar puedes poner una propiedad en tu ModelView:

    DependencyProperty

            public static readonly DependencyProperty BotonVisibleProperty = DependencyProperty.Register("BotonVisible", typeof(Visibility), typeof(ClassActual));
            public Visibility BotonVisible
            {
                get { return (Visibility)GetValue(BotonVisibleProperty); }
                set { SetValue(BotonVisibleProperty, value); }
            }
    


    Y puedes tener un método asíncrono:

    Métodos asíncronos

    private async void Buscar()
    {
       // Aquí tu código
       BotonVisible = Visibility.Hidden;
       Empleados = await Obtener();
       BotonVisible = Visibility.Visible;
       // Aquí tu código
    }
    
    private Task<ObservableCollection<Empleado>> Obtener()
    {
       return Task.Run(() =>
       {
          using (EmpleadosDataAccess _empleadosDataAccess = new EmpleadosDataAccess())
          {
             return _empleadosDataAccess.CoincidenciasDeEmpleados(FiltroDeBusqueda));
          }
       });
    }
    

    Desconozco la totalidad de tu contexto, pero espero te sirva de guía el código que te proporciono.

    Considera que EmpleadosDataAccess tiene que implementar IDisposable, para no tener conflicto con el using;

    Saludos...

    • Marcado como respuesta HajimeSaito lunes, 1 de junio de 2015 22:35
    sábado, 30 de mayo de 2015 0:33
  • Gracias genio, funciono. Pero no hizo falta implementar IDispose en EmpleadosDataAccess, lo tengo que hacer igual?
    lunes, 1 de junio de 2015 22:35