当它不应该时,WPF数据网格会自动刷新

时间:2011-05-21 20:30:52

标签: c# wpf data-binding datagrid dataview

我觉得我在这里遗漏了一些东西,但我有这个数据网格,当数据源发生变化时,会自动重绘它,没有合理的理由。

我将datagrid绑定到DataView属性,该属性实现了INotifyPropertyChanged,我想在调用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 个答案:

答案 0 :(得分:2)

你有目标和来源交换。自己完成了。 UpdateSourceTrigger.Explicit设置会影响绑定如何更新,即MainScreenDataView.GetDataView属性而不是DataGrid.ItemSourceDataGrid.ItemSource目标

INotifyPropertyChanged删除MainScreenDataView对单例不起作用,因为实例不会更改,只会更改实例内的值。换句话说,GetDataView是“设置并忘记它”的属性。

只要绑定生效,就无法阻止绑定系统传播对集合所做的更改,除非您禁止触发或阻止DataView.CollectionChanged事件,以便绑定子系统不会不跑。

如果你真的想要这个,你可以断开绑定并在准备好后重新设置它或创建一个全新的DataView并在你准备好时覆盖绑定。