Frage

Ich habe ein Ansichtsmodell, das einige Eigenschaften kapselt, die in einem Optionen-Dialog bearbeitet werden. Ich kann eigentlich nicht, sie zu den Einstellungen speichern, bis sie die Ok-Taste getroffen, die auf diesem speziellen Ansichtsmodell Commit Aufruf werden am Ende.

Eine einzelne Eigenschaft in meinem Ansichtsmodell sieht wie folgt aus:

public bool SomeProperty
{
    get
    {
        return m_SomeProperty;
    }
    set
    {
        if (m_SomeProperty != value)
        {
            m_SomeProperty = value;
            NotifyPropertyChanged("SomeProperty");
        }
    }
}
private bool m_SomeProperty = Properties.Settings.Default.SomeProperty;

So ist die normale Implementierung für Commit wäre, dies zu tun:

public void Commit()
{
    Properties.Settings.Default.SomeProperty = m_SomeProperty;
    // Add other properties here...
}

Das ist nicht so schlecht, aber der Grund, warum ich das nicht ist wie, dass, wenn Sie eine neue Eigenschaft hinzufügen, müssen Sie Code für sie an zwei Stellen hinzufügen. Ich versuche zu vermeiden, dass, wenn möglich.

Zuerst dachte ich, ich könnte eine private Veranstaltung erklären genannt OnCommit und haben die Methode Commit dieses Ereignis erhöhen, und haben den Code für jede Eigenschaft hinzufügen, für den Fall, einen Event-Handler und tun das Schreiben auf die Einstellungen dort, aber ich don ‚t wissen, wie das zu tun, ohne die Event-Handler im Konstruktor trotzdem hinzufügen, was die Situation nicht helfen.

Irgendwelche Ideen? Hat jemand eine elegante Art und Weise zu tun, was ich versuche zu tun?

Bearbeiten : Dank sixlettervariables für die Antwort. Ich nahm diese Idee und gliederte sie in SoapBox Kern und offen das Ergebnis bezogen. Schauen Sie sich die Optionen-Dialog, um zu sehen, wie es funktioniert.

War es hilfreich?

Lösung

Vielleicht eine Liste von Actions pflegen ausführen?

private List<Action> commitActions = new List<Action>();

public bool SomeProperty
{
    get
    {
        return m_SomeProperty;
    }
    set
    {
        if (m_SomeProperty != value)
        {
            m_SomeProperty = value;
            lock (commitActions)
            {
                commitActions.Add(
                    () => Properties.Settings.Default.SomeProperty = value);
            }
            NotifyPropertyChanged("SomeProperty");
        }
    }
}

Dann aktualisieren Sie Ihren Commit Code in einer Schleife durch die Aktionen.

public void Commit()
{
    List<Action> commits;
    lock (commitActions)
    {
        commits = new List<Action>(commitActions);
        commitActions.Clear();
    }

    foreach (var commit in commits)
    {
        commit();
    }
}

Andere Tipps

Könnten Sie Reflektion verwenden, um zu bestimmen, welche Eigenschaften Ihre Klasse hat und durch sie durchlaufen?

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top