Principales respuestas
Data grid Maestro Detalle muy lento

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
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
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 -
-
>>lo he comentado, con igual resultado
que es lo que has comentado ? has quitado el binding de SelectedItem en el xamlLeandro Tuttini
Blog
MVP Profile
Buenos Aires
Argentina -
-
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
-