DataGrid的itemsource绑定未更新,WPF中的绑定不起作用。

6

当项目源以编程方式更改时,我无法成功更新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(code-behind)

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;

现在我的初始数据已经显示出来了,但是如果我在此之后的任何时候更改myData,我希望/期望这些更改会自动反映在我的WPF Datagrid中,可悲的是,什么也没有更新...

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

谢谢,

1个回答

7

像这样的绑定

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上的数据绑定概述文章。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接