Wpf 为什么我的DataGrid只能在视图中滚动和滚动后填充?

Wpf 为什么我的DataGrid只能在视图中滚动和滚动后填充?,wpf,binding,Wpf,Binding,我有一个WPF数据网格,其ItemsSource绑定到ObservableCollection> Tuple是我创建的一个简单类,它在一个数组中存储4个字符串。以下是通用版本: public class Tuple<T>: INotifyPropertyChanged { private int _size = 0; public Tuple(int size) { this._size = size;

我有一个WPF数据网格,其ItemsSource绑定到ObservableCollection>

Tuple是我创建的一个简单类,它在一个数组中存储4个字符串。以下是通用版本:

public class Tuple<T>: INotifyPropertyChanged
    {
        private int _size = 0;

        public Tuple(int size)
        {
            this._size = size;
            _objs = new T[_size];
        }

        private T[] _objs;

        public T this[int i]
        {
            get
            {
                return _objs[i];
            }
            set
            {
                _objs[i] = value;
                OnPropertyChanged(".[" + i + "]");
            }
        }

        public void OnPropertyChanged(string name)
        {
            PropertyChangedEventHandler handler = PropertyChanged;
            if (handler != null)
            {
                handler(this, new PropertyChangedEventArgs(name));
            }
        }

        public event PropertyChangedEventHandler PropertyChanged;
    }
公共类元组:INotifyPropertyChanged
{
私有int_size=0;
公共元组(整数大小)
{
这个。_size=size;
_objs=新的T[_大小];
}
私人T[]_objs;
公共交通工具[int i]
{
得到
{
返回_objs[i];
}
设置
{
_objs[i]=值;
OnPropertyChanged(“[”+i+“]);
}
}
公共void OnPropertyChanged(字符串名称)
{
PropertyChangedEventHandler处理程序=PropertyChanged;
if(处理程序!=null)
{
处理程序(此,新PropertyChangedEventArgs(名称));
}
}
公共事件属性更改事件处理程序属性更改;
}
在编译时,我知道我将有4列,所以我将它们绑定到元组的索引。在运行时,元组被添加到ObservaleCollection中并被修改。然而,我遇到了一个问题,我的DataGrid只在元组创建时更新。。。也就是说,我得到的输出如下所示:

数据显示在ObservaleCollection中,就像您在视图中滚动数据网格一样,单元格内的文本将显示:


有什么提示吗?

您的
元组仅在创建时更新,因为您不会通知某些索引已更改,但整个索引已更改:

public T this[int i]
{
   get { return _objs[i]; }
   set
   {
       _objs[i] = value;
       OnPropertyChanged(Binding.IndexerName);
   }
}

至于文本返回视图时出现的第二部分,默认情况下为
true
,这意味着当前不在视图中的项目不会被渲染,它们的绑定不会被评估,直到它们再次出现在视图中

(如果是另一个数据集),你怎么知道那些空格不应该在那里?@Bob。更新它以反映对同一数据集的更改。此外,我在我的集合上使用手表确认了它,并在runtimeObservableCollection期间中断。CollectionChanged事件不会在内部对象更改时触发,只有在其自身更改时才会触发。看,首先,这很好。通过对OnPropertyChanged进行更改,我的datagrid更新正确。我是否理解正确:Binding.IndexerName是一个字符串,表示元组中已更改的索引。此字符串由ObservableCollection的处理程序接收,然后向DataGrid发出警报?它只是一个常量字符串。由于indexer属性没有实名绑定类,因此会公开此常量,以便您可以通知绑定indexer中的某些内容已更改,所以它会说“此对象的某些索引已更改”,而不是“此对象的索引n已更改”?是的,这正是它的作用