gpt4 book ai didi

c# - DataGrid 项目源绑定(bind)不更新和 WPF 中的绑定(bind)不起作用

转载 作者:太空狗 更新时间:2023-10-29 23:05:47 24 4
gpt4 key购买 nike

当项目源以编程方式更改时,我无法成功更新我的 WPF 数据网格。

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。

最后对象只是一些测试类

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

代码按原样运行,没有错误,除了我在 WPF 中的数据网格是空的——我发现解决这个问题的唯一方法是在初始化数据后添加以下代码

ReaderGrid.ItemsSource = myData;

现在显示了我所有的初始数据,除了在此之后的任何时间点如果我更改 myData 我希望/期望更改自动反射(reflect)在我的 WPF Datagrid 中,遗憾的是没有任何更新...

问题 - 为什么我的 WPF 绑定(bind)不起作用(为什么我需要在 ItemSource 的代码隐藏中显式设置),为什么对 myData 的更改没有更新我的 Datagrid?

谢谢,

最佳答案

像一个绑定(bind)

ItemsSource="{Binding myData}" 

没有显式定义绑定(bind)的源对象,而只是定义源属性。它需要设置绑定(bind)目标的 DataContext,然后将其用作源对象。

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

这是 MainWindow 实例,因为 MainWindow 类拥有 source 属性,但通常它是声明绑定(bind)源属性的 View 模型类的实例(并且还实现 INotifyPropertyChanged 接口(interface)以通知属性值更改).

public ObservableCollection<obj> myData { get; } = new ObservableCollection<obj>();

public MainWindow()
{
InitializeComponent();
InitializeMyData();

DataContext = this;
}

另请注意,根据广泛接受的编码约定,C# 属性名称以大写字母开头,因此您的属性最好命名为 MyData


对于第二个问题,即未更新的数据,您的数据项类必须实现 INotifyPropertyChanged 接口(interface),例如:

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 数据绑定(bind)的所有详细信息,请参阅 Data Binding Overview MSDN 上的文章。

关于c# - DataGrid 项目源绑定(bind)不更新和 WPF 中的绑定(bind)不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40054539/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com