如何刷新每隔1分钟由DataProvider填充的DataGrid

时间:2017-12-15 05:23:04

标签: c# wpf datagrid objectdataprovider

我有以下xaml,您可以看到DataGrid正在通过DataProvider填充。

<Window x:Class="MobileDeviceAuthenticator.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="clr-namespace:MobileDeviceAuthenticator"
        Title="Device Authorization" Height="381" Width="879" AllowDrop="True">
    <Window.Resources>
        <!-- create an instance of our DataProvider class -->
        <ObjectDataProvider x:Key="MobileManagerDataProvider" ObjectType="{x:Type local:MobileManagerDataProvider}"/>
        <!-- define the method which is invoked to obtain our data -->
        <ObjectDataProvider x:Key="MOBILE_MANAGER" ObjectInstance="{StaticResource MobileManagerDataProvider}" MethodName="GetDevices"/>
        <!-- create an instance of our DataProvider class -->
        <ObjectDataProvider x:Key="MobileRequestDataProvider" ObjectType="{x:Type local:MobileRequestDataProvider}"/>
        <!-- define the method which is invoked to obtain our data -->
        <ObjectDataProvider x:Key="MOBILE_REQUESTS" ObjectInstance="{StaticResource MobileRequestDataProvider}" MethodName="GetDevices"/>
    </Window.Resources>
    <Grid Name="GridContainer" >
        <Grid>
            <DataGrid Name="dgAuthorization" 
                      HorizontalAlignment="Stretch"
                      VerticalAlignment="Stretch" 
                      DataContext="{Binding Source={StaticResource MOBILE_MANAGER}}" 
                      ItemsSource="{Binding}" 
                      AutoGenerateColumns="False" >
                <DataGrid.Columns>
                    <DataGridTextColumn Binding="{Binding Path=DESCRIPTION}" Header="Description" />
                    <DataGridTextColumn Binding="{Binding Path=DEVICE_TYPE}" Header="Device Type" IsReadOnly="True" />
                    <DataGridTextColumn Binding="{Binding Path=DEVICE_ID}" Header="Device ID" IsReadOnly="True" />
                </DataGrid.Columns>
            </DataGrid>
        </Grid>
        <Grid>
            <DataGrid Name="dgRequest" 
                      SelectionMode="Single" 
                      HorizontalAlignment="Stretch"
                      VerticalAlignment="Stretch"
                      DataContext="{Binding Source={StaticResource MOBILE_REQUESTS}}"
                      ItemsSource="{Binding}"  
                      AutoGenerateColumns="False" >
                <DataGrid.Columns>
                    <DataGridTextColumn Binding="{Binding Path=DESCRIPTION}" Header="Description" />
                    <DataGridTextColumn Binding="{Binding Path=DEVICE_TYPE}" Header="Device Type" IsReadOnly="True" />
                    <DataGridTextColumn Binding="{Binding Path=DEVICE_ID}" Header="Device ID" IsReadOnly="True" />
                    <DataGridTextColumn Binding="{Binding Path=REQUEST_DATE}" Header="Request Date" />
                </DataGrid.Columns>
            </DataGrid>
        </Grid>
    </Grid>
</Window>

以下是DataProvider类代码

public class MobileManagerDataProvider
{
    private MobileManagerDataSetTableAdapters.MOBILE_MANAGERTableAdapter mmAdapter;
    private MobileManagerDataSet mmDataSet;

    public MobileManagerDataProvider()
    {
        mmDataSet = new MobileManagerDataSet();
        mmAdapter = new MobileManagerDataSetTableAdapters.MOBILE_MANAGERTableAdapter();
        mmAdapter.Fill(mmDataSet.MOBILE_MANAGER);

        mmDataSet.MOBILE_MANAGER.MOBILE_MANAGERRowChanged += new MobileManagerDataSet.MOBILE_MANAGERRowChangeEventHandler(AuthenticationRowModified);
        mmDataSet.MOBILE_MANAGER.MOBILE_MANAGERRowDeleted += new MobileManagerDataSet.MOBILE_MANAGERRowChangeEventHandler(AuthenticationRowModified);
    }

    public DataView GetDevices()
    {
        return mmDataSet.MOBILE_MANAGER.DefaultView;
    }

    void AuthenticationRowModified(object sender, MobileManagerDataSet.MOBILE_MANAGERRowChangeEvent e)
    {
        mmAdapter.Update(mmDataSet.MOBILE_MANAGER);
    }
}

在代码隐藏中,我希望每分钟都设置一个Timer,以刷新DataGrids

Timer很容易,但刷新数据却让我望而却步。我已经尝试了以下一些陈述。

ObjectDataProvider dataProvider = this.TryFindResource("MobileManagerDataProvider") as ObjectDataProvider;
dataProvider.Refresh();

dgAuthorization.Items.Refresh();

CollectionViewSource.GetDefaultView(dgAuthorization.ItemsSource).Refresh();

无济于事,我怎样才能做到这一点?

1 个答案:

答案 0 :(得分:1)

这是一个完整的工作示例,每当您选择一个项目(不是同一项目两次)时,它会在DataGrid

我已经回复了一个示例,每当您在其中选择一个项目时,都会将新数据绑定到DataGrid,您可以展开这种情况,因此每次收集更改时,它都会反映在您的{自动{1}},因此,只要您的数据发生变化,您只需转到DataGrid属性,它们就会在视图中更新

<强> MainWindow.xaml

GridData

MainWindow.xaml.cs 此处没有任何内容,只需删除未使用的参考资料

<Window x:Class="BindingDataGrid.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:local="clr-namespace:BindingDataGrid"
        Title="MainWindow" Height="350" Width="525">

        <Window.DataContext>
            <local:MainViewModel />
        </Window.DataContext>
    <Grid>
        <DataGrid  ColumnWidth="*" 
                    IsReadOnly="True"
                    AutoGenerateColumns="False"
                    SelectionMode="Single" 
                    HorizontalContentAlignment="Center" 
                    ItemsSource="{Binding GridData}"
                    SelectedItem="{Binding SelectedData, UpdateSourceTrigger=PropertyChanged}"
                    CanUserResizeRows="False"
                    ScrollViewer.CanContentScroll="True"
                    ScrollViewer.VerticalScrollBarVisibility="Auto"
                    ScrollViewer.HorizontalScrollBarVisibility="Auto">
            <DataGrid.Columns>
                <DataGridTextColumn Header="Column 01" Binding="{Binding Column1}"   Width="*"/>
                <DataGridTextColumn Header="Column 02" Binding="{Binding Column2}"   Width="*"/>
            </DataGrid.Columns>
        </DataGrid>
    </Grid>
</Window>
using System.Windows; namespace BindingDataGrid //`BindingDataGrid` is my namespace { /// <summary> /// Interaction logic for MainWindow.xaml /// </summary> public partial class MainWindow : Window { public MainWindow() { InitializeComponent(); } } }

您需要的所有参考

MainViewModel

<强> MainViewModel

using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.ComponentModel;
using System.Linq;
using System.Runtime.CompilerServices;