Wpf 为什么我的DataGrid只能在视图中滚动和滚动后填充?
我有一个WPF数据网格,其ItemsSource绑定到ObservableCollection> Tuple是我创建的一个简单类,它在一个数组中存储4个字符串。以下是通用版本: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;
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已更改”?是的,这正是它的作用