Frage

ich in einer Situation bin, wo ich von einer externen Quelle informiert bin ist, dass eine bestimmte Einheit außerhalb meines aktuellen Datacontext verändert wurde. Ich bin in der Lage, die Einheit zu finden und rufen aufzufrischen wie so

MyDataContext.Refresh (RefreshMode.OverwriteCurrentValues, myEntity);

und die Eigenschaften, die auf der Einheit verändert wurden, werden korrekt aktualisiert. Weder der INotifyPropertyChanging INotifyPropertyChanged scheinen angehoben zu werden, wenn die Aktualisierung auftritt und das lässt meine UI falsche Informationen angezeigt werden.

Ich bin mir bewusst, dass Refresh () die richtige Eigenschaft Getter und Setter auf dem Unternehmen nicht nutzt die Änderungsbenachrichtigungsereignisse zu erhöhen, aber vielleicht gibt es einen anderen Weg, um das Gleiche zu erreichen?

Mache ich etwas falsch? Gibt es eine bessere Methode als Refresh? Wenn Aktualisieren, um die einzige Option ist, hat jemand eine Arbeit hat, um?

War es hilfreich?

Lösung

Ich hatte ein ähnliches Problem. Ich war die Bindung an eine TreeView und benötigen Refresh in Reaktion auf den Benutzer rufen einen Bearbeitungsvorgang abgebrochen wird. Die Refresh() Methode setzt folgsam alle ursprünglichen Werte zurück, aber das war nicht in meinem TreeView UI reflektiert. Nach Rücksprache mit dem allmächtigen Google, stieß ich auf dieser Lösung:

CollectionViewSource.GetDefaultView(treeViewClusters.ItemsSource).Refresh();

Das scheint mein TreeView zu zwingen, alles zu aktualisieren. Der einzige Nachteil (und es ist eine ziemlich wichtige eins) ist, dass es alle Baumknoten zusammenzubrechen scheint, die den Benutzer veranlasst, ihren Platz zu verlieren. Ich konnte einfach eingestellt, wie gut meinen ItemsSource auf null und wieder zurück ... gleiche Wirkung, obwohl diese Methode einfacher wäre, wenn Sie eine Reihe von gebundenen Textfeldern oder etwas haben, da Sie nicht jeden einzelnen erneut zu binden müßten.

Gibt es eine bessere Lösung als das?

Editiert: Ja, es gibt ...

Ein smarter-als-me Mitarbeiter von mir kamen mit dieser Lösung auf, die den Trick zu tun scheint. In Ihrem Teilklasse für das Linq2Sql Objekt, fügen Sie den folgenden Code ein:

public void SendPropertiesChanged()
{
     foreach (System.Reflection.PropertyInfo prop in this.GetType().GetProperties())
     SendPropertyChanged(prop.Name);
}

Das können Sie dies einfach anrufen im Anwendungscode:

context.Refresh(RefreshMode.OverwriteCurrentValues, employee);
employee.SendPropertiesChanged();

Alle UI-Elemente erhalten die Nachricht, und sich entsprechend aktualisieren. Dies funktioniert auch für treeview Kontrollen und ähnliches, wo Sie wollen nicht die Benutzeroberfläche angezeigt werden „zurückzusetzen“, wenn Sie die Bindungen zu aktualisieren.

Andere Tipps

Wenn Sie wissen, Refresh () nennen, warum nicht einfach gehen Sie vor und aktualisieren Sie die UI an diesem Punkt überhaupt?

Property und Property die durch den Aufruf der Setter auf einem LINQtoSQL DBML generierte Entitätsklasse aufgerufen. Der Aufruf Refresh () macht das nicht:

[Column(Storage="_DisplayName", DbType="VarChar(50) NOT NULL", CanBeNull=false)]
public string DisplayName
{
    get
    {
        return this._DisplayName;
    }
    set
    {
        if ((this._DisplayName != value))
        {
            this.OnDisplayNameChanging(value);
            this.SendPropertyChanging();
            this._DisplayName = value;
            this.SendPropertyChanged("DisplayName");
            this.OnDisplayNameChanged();
        }
    }
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top