WPF中的DataGrid 数据动态刷新UI

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了WPF中的DataGrid 数据动态刷新UI相关的知识,希望对你有一定的参考价值。

参考技术A 数据类继承:INotifyPropertyChanged, 实现INotifyPropertyChanged接口

public class CustomTableColumes: INotifyPropertyChanged



public event PropertyChangedEventHandler PropertyChanged;

public void NotiFy(string property)



    if (PropertyChanged != null)

   

        PropertyChanged(this, new PropertyChangedEventArgs(property));

   



    //实时刷新行里的某一列调用NotiFy

      public string Colume4

       

            get

           

                return _Colume4;

           

            set

           

                _Colume4 = value;

              NotiFy("Colume4");

           

       

public class PlcDebugViewModel : GenericViewModel<XmlItemNew>



private ObservableCollection<CustomTableColumes> customTable = new ObservableCollection<CustomTableColumes>();

      public ObservableCollection<CustomTableColumes> CustomTable

       

            get

           

                return customTable;

           

            set

           

                this.customTable = value;

                this.RaisePropertyChanged(() => this.CustomTable);

           

       



<DataGrid  Name="Mygrid" Grid.Row="2" Grid.Column="1" Grid.RowSpan="24" Margin="5"  SelectedCellsChanged="DataRowSelected"  ItemsSource="Binding CustomTable" >

                            <DataGrid.Columns>

                                <DataGridTextColumn Width="130*"  Header="名称"  Binding="Binding Colume0"  IsReadOnly="True"/>

                                <DataGridTextColumn Width="60*"  Header="读写属性"  Binding="Binding Colume1"  IsReadOnly="True"/>

                                <DataGridTextColumn Width="90*"  Header="数值范围"  Binding="Binding Colume2"  IsReadOnly="True"/>

                                <DataGridTextColumn Width="100*"  Header="内控参数"  Binding="Binding Colume3"  IsReadOnly="True"/>

                                <DataGridTextColumn Width="100*"  Header="当前内容"  Binding="Binding Colume4"  IsReadOnly="True"/>

                                <DataGridTextColumn Width="195*"  Header="备注说明"  Binding="Binding Colume5"  IsReadOnly="True"/>

                                <DataGridTextColumn Width="30*"  Header=""  Visibility="Hidden"  Binding="Binding Colume6"  IsReadOnly="True"/>

                                <DataGridTextColumn Width="30*"  Header=""  Visibility="Hidden"  Binding="Binding Colume7"  IsReadOnly="True"/>

                            </DataGrid.Columns>

                        </DataGrid>

看到另一种方法

刷新 WPF Datagrid 未绑定到可观察集合?

【中文标题】刷新 WPF Datagrid 未绑定到可观察集合?【英文标题】:Refresh WPF Datagrid not bound to observable collection? 【发布时间】:2016-11-08 11:49:12 【问题描述】:

我正在使用带有 Datagrid 的 LINQ to SQL 并将数据绑定到自动生成的字段。通过 LINQ 提交更改时,数据更新正常。 我遇到的问题是直接在数据库上运行 SQL 语句后,我似乎无法刷新更新的数据。数据库数据已正确更新,关闭并重新启动应用程序数据已正确更新。

我试过了,

MyTable.Items.Refresh();

还有

private DatabaseDataContext sql = new DatabaseDataContext(
            Properties.Settings.Default.StaffConnectionString);

sql.Refresh(System.Data.Linq.RefreshMode.OverwriteCurrentValues);

用于将数据绑定到 Datagrid 列的 XAML,Info_Data 是数据库表中自动生成的字段。

<DataGridTemplateColumn Header="Info" Width="*" SortMemberPath="Words">
                                <DataGridTemplateColumn.CellTemplate>
                                    <DataTemplate>
                                        <TextBlock FontWeight="Light" Text="Binding Path=Info_Data, UpdateSourceTrigger=PropertyChanged" />
                                    </DataTemplate>
                                </DataGridTemplateColumn.CellTemplate>

从所有的角度来看,我似乎需要创建一个可观察的集合并将数据绑定到该集合并更新集合以刷新数据网格表。 有没有办法解决这个问题?

【问题讨论】:

试试:CollectionViewSource.GetDefaultView(MyTable.ItemsSource)?.Refresh(); 感谢@JohanLarsson,这也不起作用。这是相当令人沮丧的。 只需将项目放在 ObservableCollection 中,将其绑定到 XAML 中,然后继续你的生活。通过做错事来惩罚自己,您不会获得任何奖励积分。但是,如果您绝对决定浪费自己的时间,您是否尝试过为集合属性提高 PropertyChanged?还是你连绑定都不行? @EdPlunkett,不知道这是错误的方式,感谢您的建议。这是我的第一个真正的应用程序,所以仍在尝试很多东西,我将不得不重新编写一些代码来将所有内容与ObservableCollection 绑定。不确定我是否遵循您对 collection 属性的意思? 您是如何将项目放入网格中的? “正确”的方法是将集合公开为视图模型的属性,并将其绑定到 XAML 中的 DataGrid.ItemsSource。不过,我有一种感觉,这不是你所做的。顺便说一句,我认为您知道 ObservableCollection 是正确的方法,因为您提到知道它会解决您的所有问题。但是,是的,这不仅仅是 a 方式,而是 方式。 【参考方案1】:

您可以尝试使用 SqlDataAdapter 和 DataTable 从数据库加载信息并绑定到 DataGrid:

var da = new SqlDataAdapter("SELECT * FROM " + view, conn);
var dt = new DataTable();
da.Fill(dt);
var dg = new DataGrid();// Your DataGrid
dg.ItemsSource = dt.DefaultView;

更新时:

dt.Rows.Clear();
da.Fill(dt);
dt.AcceptChanges();

【讨论】:

以上是关于WPF中的DataGrid 数据动态刷新UI的主要内容,如果未能解决你的问题,请参考以下文章

C# wpf datagrid 动态加载数据后改变单元格颜色bug

easy ui datagrid翻页刷新问题

WPF DataGrid下滑动态加载数据

WPF Datagrid 动态生成列 并绑定数据

WPF DataGrid中一列中的动态单元格控件

WPF DataGrid 动态样式