1

我有一个 WPF DataGrid,其 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;
    }

在编译时我知道我将有 4 列,所以我将它们绑定到元组的索引。在运行时,元组被添加到 ObservableCollection 并被修改。但是,我遇到了一个问题,即我的 DataGrid 仅在创建元组时更新......也就是说,我得到如下所示的输出:

在此处输入图像描述

数据存在于 ObservableCollection 中,就像您将 DataGrid 滚动进出视图一样,单元格内的文本会出现:

在此处输入图像描述

有小费吗?

4

1 回答 1

2

Tuple只有在创建它时才会更新,因为您没有通知某些索引已更改但整个索引器属性已更改:

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

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

于 2013-08-15T20:23:15.490 回答