WPF datagrid обновляется сам по себе, когда он не должен - PullRequest
3 голосов
/ 22 мая 2011

Мне кажется, что я что-то здесь упускаю, но у меня есть эта таблица данных, которая, когда источник данных изменяется, автоматически перерисовывает его самостоятельно без логической причины для этого.

У меня есть сетка данных, связанная со свойством 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, что и окно. Экземпляр хранится в словаре в единственном числе.

Теперь я не вижу причин, по которым сетка данных могла бы обновляться самостоятельно, я даже пытался удалить содержимое INotifyPropertyChanged из MainScreenDataview, но он сохраняет то же поведение.

Думаю, что-то здесь мне не хватает. Поведение по умолчанию где-то, что должно быть переопределено или что-то?

1 Ответ

2 голосов
/ 22 мая 2011

У вас есть цель и источник поменялись местами. Сделал это сам. Параметр UpdateSourceTrigger.Explicit влияет на то, как привязка обновляет источник , который является свойством MainScreenDataView.GetDataView, а не DataGrid.ItemSource. DataGrid.ItemSource является целью .

Удаление INotifyPropertyChanged из MainScreenDataView не повлияет на синглтон, потому что экземпляр не изменяется, только значения внутри экземпляра. Другими словами, GetDataView является свойством «установить и забыть».

Пока действует привязка, невозможно предотвратить распространение изменений, внесенных в коллекцию, системой привязки, если вы не подавите или не заблокируете события DataView.CollectionChanged, чтобы подсистема привязки просто не бежать.

Если вы действительно этого хотите, вы можете отключить привязку и установить ее заново, когда будете готовы, или создать совершенно новый DataView и перезаписать привязку, когда будете готовы.

...