¿Cómo actualizar / recargar la cuadrícula de datos en WPF?

Quiero implementar una cuadrícula de datos, que se llenará cada 5 minutos.

Pero, primer código: XAML:

    <Window.Resources>
    <ObjectDataProvider x:Key="_employeeProvider" ObjectType="{x:Type Brw1:EmployeeDataProvider}" />
    <ObjectDataProvider x:Key="_employeeFactory" ObjectInstance="{StaticResource _employeeProvider}" MethodName="GetEmployees" />
</Window.Resources>

<Grid DataContext="{Binding Source={StaticResource _employeeFactory}}">
    <DataGrid Name="_employeeDataGrid" DockPanel.Dock="Top" Margin="12,57,12,0" VerticalAlignment="Top" ItemsSource="{Binding}" AutoGenerateColumns="True">
    </DataGrid>
</Grid>

C #:

    public class EmployeeDataProvider
{
    public ObservableEmployee GetEmployees()
    {
        // This is only example
        // In my project right here I will get data from database, put into the list, and fill datagrid with it. 
        List<UIEmployee> list = new List<UIEmployee>
                {
                    new UIEmployee { Id = 1, FirstName = "Prajeesh2", LastName = "Prathap", Occupation = "Engineer", DateOfJoining=new DateTime(2005, 8, 1), IsContracter = false, AddressInfo = null },
                    new UIEmployee { Id = 2, FirstName = "Rahul2", LastName = "Bose", Occupation = "Student", DateOfJoining=new DateTime(2009, 5, 4), IsContracter = true, AddressInfo = null },
                    new UIEmployee { Id = 3, FirstName = "Steve2", LastName = "Roberts", Occupation = "Manager", DateOfJoining=new DateTime(1994, 8, 23), IsContracter = false, AddressInfo = null },
                    new UIEmployee { Id = 4, FirstName = "Micheal2", LastName = "Clarke", Occupation = "Engineer", DateOfJoining=new DateTime(2003, 1, 14), IsContracter = true, AddressInfo = null },
                    new UIEmployee { Id = 5, FirstName = "Rachel2", LastName = "Green", Occupation = "Professional", DateOfJoining=new DateTime(2006, 3, 8), IsContracter = true, AddressInfo = null }
                };

        ObservableEmployee employeeCollection = new ObservableEmployee(list);
        return employeeCollection;
    }
}

Es muy simple. Uso de la cuadrícula de datos GetEmployees() método para obtener datos.

Lo que intento hacer es ejecutar GetEmployess cada 5 minutos.

PS. _employeeDataGrid.Items.Refresh(); - no funciona.

ACTUALIZACIÓN:

Falta de clases:

    public class ObservableEmployee : ObservableCollection<UIEmployee>
{
    public ObservableEmployee(IEnumerable<UIEmployee> employees) : base(employees) { }
}

public class UIEmployee// : INotifyPropertyChanged
{
    private int m_Id;
    public int Id
    {
        get { return m_Id; }
        set
        {
            m_Id = value;
        }
    }

    private string m_FirstName;
    public string FirstName
    {
        get { return m_FirstName; }
        set
        {
            m_FirstName = value;
        }
    }

    private string m_LastName;
    public string LastName
    {
        get { return m_LastName; }
        set
        {
            m_LastName = value;
        }
    }

    private string m_Occupation;
    public string Occupation
    {
        get { return m_Occupation; }
        set
        {
            m_Occupation = value;
        }
    }

    private DateTime m_DateOfJoining;
    public DateTime DateOfJoining
    {
        get { return m_DateOfJoining; }
        set
        {
            m_DateOfJoining = value;
        }
    }

    private bool m_IsContracter;
    public bool IsContracter
    {
        get { return m_IsContracter; }
        set
        {
            m_IsContracter = value;
        }
    }

}

ACTUALIZACIÓN2: necesito algo, que recargará la cuadrícula de datos, por lo que la cuadrícula de datos tendrá que usar GetEmployees método de nuevo.

UPDATE3:

public class TaskDataProvider
{
    static ObservableEmployee list = new ObservableEmployee();
    static DataRepository dr = new DataRepository();

    public static ObservableEmployee GetEmployees()
    {
        UpdateMyList();
        return list;
    }

    public static void UpdateMyList() 
    {
        ObservableTask newList = new ObservableTask(dr.GetTasks());

        list.Clear();
        foreach (Task t in newList)
        {
            list.Add(t);
        }
    }
}

Esto al principio funciona. Pero eso, cambio algo en la base de datos y hago clic en el botón que hace:

TaskDataProvider.UpdateMyList();

Y en el punto de interrupción, obtiene los datos correctos (datos nuevos), pero la cuadrícula de datos no se actualiza: /

preguntado el 27 de agosto de 11 a las 15:08

¿Puede, por favor, publicar un código donde realmente asigne a DataContext la colección que obtuvo de GetEmployees ()? -

Yo hice. Eso es todo. Solo faltan dos métodos: UIEmployee y ObservableEmployee. Datagrid usa DataContext de la cuadrícula principal, por lo que "_employeeFactory" y esta clase usan el método "GetEmployees" que devuelve ObservableEmployee. No hay más código. -

3 Respuestas

dataGrid1.Items.refresh ();

para actualizar el contenido de DataGrid

Respondido 25 Jul 13, 10:07

O puedes simplemente anular ItemsSource y lo inicializó de nuevo:

dataGridView.ItemsSource = null;
dataGridView.ItemsSource = ItemsSourceObjects;

Respondido el 04 de Septiembre de 15 a las 16:09

Supongo que esta causa vinculante no es consciente de que ha cambiado de colección. Sugeriría, o:

  • Limpiar y luego rellenar una colección previamente enlazada a la cuadrícula con nuevos datos (la misma colección, como en GetEmployees() cada vez que crea uno nuevo.

or

  • Antes de asignar una nueva colección tratan para asignar a DataContext null o una colección vacía y luego asignar una nueva.

or

EDITAR

 ObservableEmployee <UIEmployee> list = new ObservableEmployee <UIEmployee>(); //move list to global variables and declare it as ObservableCollection
 public ObservableEmployee GetEmployees()
    {

       //here only return an instance of list
       return list;

    }

//this method call when you want to update data on gri
public void UpdateMyList() {

     //clear list 
     list.Clear();

     //after add all data
     list.Ad(..);
     list(..); 
     .
     .

}

Respondido 28 ago 11, 16:08

Lo siento, pero no sé cómo, en caso de que los dos primeros sugieran. Y tercero, leí todo el tema, pero todavía no puedo lidiar con ese problema. Empecé con WPF hace solo unos días. ¿Podrías ayudarme y mostrar esto en mi código? - Marshall

Si después de cada 5 segundos necesita actualizar el contenido de DataGrid, intente no crear una nueva lista cada vez en el método GetEmployees (). Pero una instancia global, y dentro de ese método, actualice la lista con los nuevos datos cada 5 segundos. - Tigran

Hola, gracias por la repetición. Pero mi problema es que no sé cómo actualizar la lista: / Tengo un punto de interrupción dentro del método "GetEmployees", y durante la depuración solo se detiene allí una vez (al principio). De lo que llamo "_employeeDataGrid.Items.Refresh ();" y "GetEmployees" no se llama. - Marshall

@Marshall: vea mi publicación editada. La lista se declara como ObservableCollection, en GetEmployess devuelve la misma lista y no crea una nueva cada vez, y hay un método para actualizar un contenido de la lista. Entonces, considerando el hecho de que la lista es ObservableCollection y está vinculada a la cuadrícula, en irdr para actualizar el contenido de grdi, solo necesita cambiar los datos de la lista, todo lo demás se hará mediante el mecanismo de vinculación de WPF. - Tigran

@PintuPaul: tratan para restablecer el enlace de datos. El enlace de datos guarda internamente un puntero a una estructura de datos que asignó primero, estableciendo nulo pueden Descansarlo para que la nueva asignación pueda tener efecto deseado. - Tigran

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.