3 Stimmen

WPF Datagrid aktualisiert sich von selbst, obwohl es nicht sollte

Ich habe das Gefühl, dass mir hier etwas fehlt, aber ich habe dieses Datagrid, das sich automatisch neu zeichnet, wenn sich die Datenquelle ändert, ohne dass es dafür einen logischen Grund gibt.

Ich bin das Datagrid an eine DataView-Eigenschaft gebunden, die INotifyPropertyChanged implementiert, und ich möchte einige andere Dinge tun, wenn dieses Ereignis ausgelöst wird, bevor Refresh() aufgerufen wird.

Hier ist also die Datenquelle.

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()
    {
    }
}

Und die Bindung (ich rufe dies im Konstruktor des Fensters auf)

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);
}

Die Klasse, die die DataView mit Daten aus einer Datenbank aktualisiert, hat Zugriff auf dieselbe Instanz von MainScreenDataView wie das Fenster. Die Instanz wird in einem Singleton in einem Dictionary aufbewahrt.

Jetzt sehe ich keinen Grund, warum sich das Datagrid selbst aktualisieren würde. Ich habe sogar versucht, INotifyPropertyChanged aus MainScreenDataview zu entfernen, und dennoch bleibt das Verhalten dasselbe.

Ich vermute, dass mir hier etwas fehlt. Standardverhalten irgendwo, das überschrieben werden muss oder so etwas?

2voto

Rick Sladkey Punkte 33363

Sie haben Ziel und Quelle vertauscht. Das habe ich auch schon gemacht. Die Einstellung UpdateSourceTrigger.Explicit beeinflusst, wie die Bindung die Quelle, die die Eigenschaft MainScreenDataView.GetDataView ist, aktualisiert, nicht die DataGrid.ItemSource. Das DataGrid.ItemSource ist das Ziel.

Das Entfernen von INotifyPropertyChanged aus MainScreenDataView hat keine Auswirkung auf ein Singleton, weil sich die Instanz nicht ändert, nur die Werte innerhalb der Instanz. Mit anderen Worten, GetDataView ist eine Eigenschaft zum "Setzen und Vergessen".

Solange die Bindung aktiv ist, gibt es keine Möglichkeit, Änderungen an der Sammlung davon abzuhalten, vom Bindungssystem weitergeleitet zu werden, es sei denn, Sie unterdrücken, dass DataView.CollectionChanged Ereignisse ausgelöst werden oder blockieren, damit das Bindungsunterseite einfach nicht ausgeführt wird.

Wenn Sie dies wirklich wollen, können Sie die Bindung trennen und sie erneut setzen, wenn Sie bereit sind, oder eine vollständig neue DataView erstellen und die Bindung überschreiben, wenn Sie bereit sind.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X