none
Data grid Maestro Detalle muy lento RRS feed

  • Pregunta

  • Hola, tengo un formulario maestro detalle, como se aprecia en la imagen con el código que ahora indicaré.

    El problema es que el DataGrid de la izquierda es muy lento a la hora de bajar con el cursor o seleccionar una celda con el ratón.

    ¿Podrían decirme si es algún problema al estructurar la relación con el SelectedItem?¿O es un problema en la carga del Contexto?. Muchas gracias

    

    XAML

    <Window
            xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
            xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
            xmlns:ViewModels="clr-namespace:SGP.ViewModels" x:Class="SGP.Views.EditaOperaciones"
            Title="Editaoperaciones" Height="350" Width="700">
        <Window.Resources>
            <ResourceDictionary>
                <ResourceDictionary.MergedDictionaries>
                    <ResourceDictionary Source="/Resources/Styles.xaml" />
                </ResourceDictionary.MergedDictionaries>
                <CollectionViewSource x:Key="ListaOperacionesGrid" Source="{Binding ListaOperaciones}"/>
                <CollectionViewSource x:Key="ListaParametrosGrid" Source="{Binding ParametrosOperaciones, Source={StaticResource ListaOperacionesGrid}}"/>
            </ResourceDictionary>
        </Window.Resources>
        <Grid>
            <Grid.RowDefinitions>
                <RowDefinition Height="40"/>
                <RowDefinition Height="*"/>
                <RowDefinition Height="50"/>
            </Grid.RowDefinitions>
            <Grid.ColumnDefinitions>
                <ColumnDefinition Width="*"/>
                <ColumnDefinition Width="*"/>
            </Grid.ColumnDefinitions>
            <StackPanel Grid.Row="0" Grid.ColumnSpan="2">
                <TextBlock HorizontalAlignment="Center" Text="CONFIGURAR OPERACIONES PARA LA MAQUINA" Style="{StaticResource Titulos}"/>
                <TextBlock HorizontalAlignment="Center" Text="{Binding MaquinaSeleccionada.Nombre}" Style="{StaticResource TituloRojo}"/>
            </StackPanel>
            <StackPanel Grid.Row="1" Grid.Column="0" Background="Azure">
                <TextBlock Text="OPERACOINES QUE REALIZA LA MÁQUINA" Style="{StaticResource TextoAzulGrande}" HorizontalAlignment="Center"/>
                <StackPanel  Margin="5" Orientation="Horizontal" HorizontalAlignment="Center">
                    <TextBlock Margin="5" Text="Ocultar Obsoletas"/>
                    <CheckBox Margin="5" IsChecked="{Binding OcultaObsoleto}" Command="{Binding OcultaObsoletoCommand }"/>
                </StackPanel>
                <DataGrid Margin="5,0,5,5" EnableRowVirtualization="True" HorizontalAlignment="Center"  AutoGenerateColumns="False" VerticalAlignment="Top" ItemsSource="{Binding Source={StaticResource ListaOperacionesGrid}}" IsReadOnly="True" SelectedItem="{Binding OperacionSeleccionada}">
                    <DataGrid.Columns>
                        <DataGridTextColumn Width="2*" Binding="{Binding Denominacion}" Header="Denominación" />
                        <DataGridTextColumn Width="3*" Binding="{Binding Descripcion}" Header="Descripción" />
                        <DataGridCheckBoxColumn Width="*" Binding="{Binding Obsoleto}" Header="Obsoleto"/>
                    </DataGrid.Columns>
                </DataGrid>
            </StackPanel>
    
            <StackPanel Grid.Row="1" Grid.Column="1"  Background="Azure" Margin="10"  VerticalAlignment="Center" Height="210">
                <TextBlock Text="PARÁMETROS PARA LA OPERACIÓN" Style="{StaticResource TextoAzulGrande}" HorizontalAlignment="Center"/>
                <TextBlock Text="{Binding Operacion}" Style="{StaticResource TextoRojo}" HorizontalAlignment="Center"/>
    
                <DataGrid VerticalAlignment="Center" EnableRowVirtualization="True" Margin="5,20,5,5" HorizontalAlignment="Center"  AutoGenerateColumns="False" ItemsSource="{Binding Source={StaticResource ListaParametrosGrid}}" IsReadOnly="True">
                    <DataGrid.Columns>
                        <DataGridTextColumn Width="2*" Binding="{Binding PosicionMemoria}" Header="Zona de memoria" />
                        <DataGridTextColumn Width="*" Binding="{Binding Valor}" Header="Valor" />
                        <DataGridCheckBoxColumn Width="*" Binding="{Binding Descripcion}" Header="Descripción"/>
                    </DataGrid.Columns>
                </DataGrid>
            </StackPanel>
    
            <StackPanel  Grid.Row="2" Orientation="Horizontal" HorizontalAlignment="Center" VerticalAlignment="Center">
                <Button HorizontalAlignment="Center"  VerticalAlignment="Top" Width="140" Command="{Binding EditCommand}" CommandParameter="Edit">
                    <StackPanel Orientation="Horizontal" >
                        <Image Source="/Imagenes/Iconos/edit.png" Width="30" Margin="5,0,5,0"/>
                        <TextBlock VerticalAlignment="Center" Text="Editar Operación"/>
                    </StackPanel>
                </Button>
                <Button HorizontalAlignment="Center"  VerticalAlignment="Top" Width="140" Command="{Binding EditCommand}" CommandParameter="New">
                    <StackPanel Orientation="Horizontal" >
                        <Image Source="/Imagenes/Iconos/add.png" Width="30" Margin="5,0,5,0"/>
                        <TextBlock VerticalAlignment="Center" Text="Nueva Operación"/>
                    </StackPanel>
                </Button>
            </StackPanel>
        </Grid>
    </Window>
    

    View Model

    using System;
    using System.Collections.Generic;
    using System.Collections.ObjectModel;
    using System.ComponentModel;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.Windows;
    using System.Windows.Input;
    using SGP.Views;
    
    namespace SGP.ViewModels
    {
        public class EditaOperacionesVM : NotifyPropertyChangedBase,IDisposable
        {
            #region Globales
            //private SGPContext _context = new SGPContext();
            private SGPContext _context=new SGPContext();
            bool BotonGuardar = false;//Para distinguir cuando se activa por la x de cerrar ventana o cuando se cierra porque hemos guardado.
            public Action BotonGuardarAction { get; set; }//Crea una accion para informar que se ha pulsado guardar    
            #endregion
            #region Comandos
            private ICommand _editCommand;
            public ICommand EditCommand { get { return _editCommand; } }
            private ICommand _ocultaObsoletoCommand;
            public ICommand OcultaObsoletoCommand { get { return _ocultaObsoletoCommand; } }
            private ICommand _editaOperacionCommand;
            public ICommand EditaOperacionCommand { get { return _editaOperacionCommand; } }
            #endregion
    
            #region Propiedades
            private ObservableCollection<Operaciones> _listaOperaciones;
            public ObservableCollection<Operaciones> ListaOperaciones//Enlace al grid de máquinas
            {
                get { return _listaOperaciones; }
                set { SaveAndNotify(ref _listaOperaciones, value); }
            }
    
            private bool _ocultaObsoleto;
            public bool OcultaObsoleto { get { return _ocultaObsoleto; } set { SaveAndNotify(ref _ocultaObsoleto, value); } }
    
            private Maquinas _maquinaSeleccionada;
            public Maquinas MaquinaSeleccionada
            {
                get { return _maquinaSeleccionada; }
                set
                {
                    if (value != null)
                    {
                        SaveAndNotify(ref _maquinaSeleccionada, value);
                    }
                }
            }
    
            private Operaciones _operacionSeleccionada;
            public Operaciones OperacionSeleccionada
            {
                get { return _operacionSeleccionada; }
                set
                {
                    if (value != null)
                    {
                        SaveAndNotify(ref _operacionSeleccionada, value);
                    }
                }
            }
            #endregion
            #region Constructor
            public EditaOperacionesVM() { }
            public EditaOperacionesVM(Maquinas MaquinaSeleccionada)
            {
                //EditCommand
                _editCommand = new RelayCommand((modo) => this.ShowEditaOperacion((string)modo));//modo es el un parámetro en el botón
                //FiltroObsoletasCommand
                _ocultaObsoletoCommand = new RelayCommand((param) => this.ReCargaContexto());
                this.MaquinaSeleccionada = MaquinaSeleccionada;
                OcultaObsoleto = true;//En la primera carga no se muestran las obsoletas.
                this.CargaContexto();
            }
            #endregion
    
            #region Funciones de comandos
            /// <summary>
            /// Mostrar la ventana de configuración de la máquina seleccionada
            /// </summary>
            /// <param name="param">"Edit" o "New" dependiendo del botón pulsado.</param>
            public void ShowEditaOperacion(string modo)
            {
                Operacion EditaOperacionWindow = new Operacion();
                OperacionVM EditaOperacionWindowVM = new OperacionVM(_operacionSeleccionada, modo);//Si el modo es New, máquina seleccionada no se usará.
                EditaOperacionWindow.DataContext = EditaOperacionWindowVM;
                //Accion asociada al botón guardar.;
                EditaOperacionWindow.ShowDialog();
            }
    
            #endregion
            #region Procedimientos auxiliares
    
            /// <summary>
            /// Se llama depués de aplicar un filtro
            /// </summary>
            private void ReCargaContexto()
            {
    
                //_context.Entry(ListaMaquinas).Reload();
                this.CargaContexto();
                RaisePropertyChanged("ListaOperaciones");
            }
            /// <summary>
            /// Se encarga de cargar el contexto con el filtro aplicado
            /// </summary>
            private void CargaContexto()
            {
                try
                {
                    _context = new SGPContext();
                    _context.Operaciones.Where(o => ((o.Obsoleto == false || o.Obsoleto != OcultaObsoleto) && o.Maquina_ID == MaquinaSeleccionada.ID_Maquina)).OrderBy(c => c.Descripcion).ToList();
                    ListaOperaciones = _context.Operaciones.Local;
                }
                catch (Exception e) { System.Windows.MessageBox.Show("Revise que todos los campos obligatorios están cumplimentados" + e); }
                }
     
            #endregion
            #region Dispose
            public void Dispose()
            {
                _context.Dispose();
            }
            #endregion
        }
    }
    

    Código en el VM padre que crea la ventana y asigna el VM

            public void ShowEditaOperaciones()
            {
                EditaOperaciones EditaOperacionesWindow = new EditaOperaciones();
                EditaOperacionesVM EditaOperacionesWindowVM = new EditaOperacionesVM(_maquinaSeleccionada);
                EditaOperacionesWindow.DataContext = EditaOperacionesWindowVM;
                EditaOperacionesWindow.Closing += this.OnWindowClosing;
                EditaOperacionesWindow.ShowDialog();
            }


    Juan Pablo Toledo España

    jueves, 9 de abril de 2015 22:02

Respuestas

  • despues de haber quitado el SaveAndNotify y el binding al ir seleccionado se realiza alguna accion, como se completar algun control ?

    porque si sigue funcionando tal cual lo tenias antes de comentar entonces no tomo el cambio, prueba realizar un Rebuild de la solucion

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    • Marcado como respuesta jpabloace domingo, 12 de abril de 2015 20:04
    viernes, 10 de abril de 2015 20:36

Todas las respuestas

  • hola

    por lo que observo en el grid de la izquierda define un binding al  SelectedItem="{Binding OperacionSeleccionada}"

    en el viewmodel usas en esa propiedad el metodo SaveAndNotify(), quizas lo que implementas alli genera esa lentitud

    podrias probar quitando el binding o comentando ese metodo de la propiedad a ver si mejora el compartamiento del grid y asi detectar que la causa

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    viernes, 10 de abril de 2015 11:45
  • Hola, gracias, lo he comentado, con igual resultado, hay un retardo apreciable entre que selecciono, o me desplazo con las flechas hasta que aparece como seleccionado el objeto destino. 


    Juan Pablo Toledo España

    viernes, 10 de abril de 2015 12:36
  • >>lo he comentado, con igual resultado

    que es lo que has comentado ? has quitado el binding de SelectedItem en el xaml

    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    viernes, 10 de abril de 2015 14:40
  • Hola, he comentado el método SaveAndNotify() y quitando el binding, pero sigue igualmente lento. No sé que puede ser, en otros grid de otros formularios no me sucede. Gracias.

    Juan Pablo Toledo España

    viernes, 10 de abril de 2015 17:53
  • despues de haber quitado el SaveAndNotify y el binding al ir seleccionado se realiza alguna accion, como se completar algun control ?

    porque si sigue funcionando tal cual lo tenias antes de comentar entonces no tomo el cambio, prueba realizar un Rebuild de la solucion

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    • Marcado como respuesta jpabloace domingo, 12 de abril de 2015 20:04
    viernes, 10 de abril de 2015 20:36
  • Hola, al reconstruir la solución se ha solucionado. Gracias

    Juan Pablo Toledo España

    domingo, 12 de abril de 2015 20:05