DataGrid项目源绑定不更新,WPF中的绑定不工作

本文关键字:绑定 工作 WPF 更新 项目 DataGrid | 更新日期: 2023-09-27 18:13:13

当项目源以编程方式更改时,我无法成功更新WPF Datagrid。

XAML

<DataGrid Name="ReaderGrid" ItemsSource="{Binding myData}" Height="Auto" Width="Auto" AutoGenerateColumns="False" CanUserAddRows="False" CanUserDeleteRows="False" CanUserResizeColumns="False" CanUserResizeRows="False" CanUserReorderColumns="False" IsReadOnly="True" GridLinesVisibility="None">
    <DataGrid.Columns>
        <DataGridTextColumn Header="Count" Width="*" FontSize="14" Binding="{Binding count}" />
        <DataGridTextColumn Header="Total" Width="*" FontSize="14" Binding="{Binding total}" />
    </DataGrid.Columns>
</DataGrid>

XAML.CS(后台代码)

public partial class MainWindow : Window
{
    public ObservableCollection<obj> myData { get; set; }
    public MainWindow()
    {
        InitializeComponent();
        myData = new ObservableCollection<obj>();
        InitializeMyData();

最后一个函数(InitializeMyData())只是用测试信息填充myData。

最后object是一个测试类

public class obj
{
    public int count { get; set; }
    public double total { get; set; }
}

代码AS-IS不工作,除了WPF中的数据网格是空的之外没有任何错误-我发现修复这个问题的唯一方法是在初始化数据后添加以下内代码

ReaderGrid.ItemsSource = myData;

现在显示了我所有的初始数据,除了在此之后的任何时间点,如果我更改了我的数据,我希望/期望这些更改会自动反映在我的WPF数据网格中,遗憾的是没有任何更新…

问题-为什么我的WPF绑定不工作(为什么我需要显式地设置在代码后面的ItemSource),为什么改变myData不更新我的Datagrid?

谢谢,

DataGrid项目源绑定不更新,WPF中的绑定不工作

这样的绑定
ItemsSource="{Binding myData}" 

不显式地定义绑定的源对象,而只定义源属性。它要求设置绑定目标的DataContext,然后将其用作源对象。

DataContext从父元素继承到子元素,通常在窗口的构造函数中设置,如下所示。

这里是MainWindow实例,因为MainWindow类拥有源属性,但通常它是一个视图模型类的实例,它声明了绑定源属性(并且还实现了INotifyPropertyChanged接口来通知属性值的变化)。

public ObservableCollection<obj> myData { get; } = new ObservableCollection<obj>();
public MainWindow()
{
    InitializeComponent();
    InitializeMyData();
    DataContext = this;
}

还请注意,根据广泛接受的编码惯例,c#属性名以大写字母开头,因此您的属性最好命名为MyData


对于第二个问题,数据没有更新,您的数据项类必须实现INotifyPropertyChanged接口,如:

public class obj : INotifyPropertyChanged 
{
    public event PropertyChanged;
    private int _count;
    public int Count
    {
        get { return _count; }
        set
        {
            _count = value;
            PropertyChanged?.Invoke(this, new PropertyChangedEventArgs("Count"));
        }
    }
}

有关WPF数据绑定的所有详细信息,请参阅MSDN上的数据绑定概述文章。