WPF数据表格在不应该刷新时自动刷新

3

我觉得我在这里缺少了什么,但是我有一个数据网格,当数据源更改时,它会自动重新绘制,没有逻辑原因可以解释它这样做。

我将datagrid绑定到一个实现INotifyPropertyChanged的DataView属性上,并且在调用Refresh()之前,我想在该事件被触发时执行一些其他操作。

所以这就是数据源。

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

    DataView _dataview;

    public DataView GetDataView
    {
        get { return _dataview; }
        set
        {
            _dataview = value;
            OnPropertyChanged("GetDataView");
        }
    }
    public MainScreenDataView()
    {
    }
}

而这个绑定(我在窗口的构造函数中调用它)

    public void MakeData()
    {
        MiddleMan midman = MiddleMan.Instance; 
        midman.PropertyChanged += new System.ComponentModel.PropertyChangedEventHandler(midman_PropertyChanged); //unrelated event for error messages
        midman.InstantiateAll();


        Binding bind = new Binding();
        bind.Source = midman.GetDict["contact"].GetDataView; //GetDict is a dictionary that holds instances of MainScreenDataView
        bind.UpdateSourceTrigger = UpdateSourceTrigger.Explicit;
        DG_Contacts.SetBinding(BetterDataGrid.ItemsSourceProperty, bind);
    }

更新DataView的类可以访问与窗口相同的MainScreenDataView实例,该实例在单例中的字典中保留。

现在我看不出为什么数据表格会自动刷新,我甚至尝试从MainScreenDataview中删除INotifyPropertyChanged的内容,但它仍然保持相同的行为。

猜想我在这里漏掉了某些东西。是否需要覆盖某个默认行为或者其他操作?

1个回答

2
您把目标和源弄反了。我自己也犯过这个错误。设置UpdateSourceTrigger.Explicit影响的是绑定更新MainScreenDataView.GetDataView属性,而不是DataGrid.ItemSource。而DataGrid.ItemSource则是目标。
MainScreenDataView中删除INotifyPropertyChanged对单例没有影响,因为实例不会改变,只有实例内部的值会改变。换句话说,GetDataView是一个“设置并忘记”的属性。
只要绑定生效,就无法阻止对集合所做的更改被绑定系统传播,除非您禁止DataView.CollectionChanged事件触发或者阻止它们以使绑定子系统根本不运行。
如果您真的想要这样做,可以断开绑定,在准备好时重新设置绑定,或在准备好时创建全新的DataView并覆盖绑定。

我明白了...但还是有点困惑。我猜我不需要使用Binding对象,我可以直接做 "DataGrid.ItemsSource = pathtodataview;",但即使这样它也会自动刷新。

我想在 "MainScreenDataView" 的 "propertychanged" 事件中执行刷新逻辑,所以解除绑定和重新绑定并不能真正起作用,因为网格在事件触发之前就开始重绘了。
- Steinthor.palsson
我不清楚的部分是,你为什么想要延迟刷新? - Rick Sladkey
嗯,这只是一个非常微小的问题。我只是想在网格刷新后保留选择,以使重新加载看起来更无缝。 - Steinthor.palsson
1
仔细想想,我可以通过在“selectionchanged”上保存所选索引,然后在我的“propertychanged”事件上重新应用它们来实现,因为这个事件会在网格更新后立即触发。 - Steinthor.palsson

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