Pregunta

Tengo un ViewModel que encapsula algunas propiedades que se están editando en un cuadro de diálogo de opciones. En realidad, no puedo guardarlos en la configuración hasta que presionen el botón Aceptar, que terminará llamando Confirmar en este ViewModel en particular.

Una propiedad individual en mi ViewModel se ve así:

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;

Entonces, la implementación normal de Commit sería hacer esto:

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

Esto no es tan malo, pero la razón por la que no me gusta es que si agrega una nueva propiedad, debe agregar código en dos lugares. Intento evitar eso cuando sea posible.

Al principio pensé que podía declarar un evento privado llamado OnCommit y hacer que el método Commit genere ese evento, y que el código de cada propiedad agregue un controlador de eventos para el evento y escriba la configuración allí, pero no lo hago No sé cómo hacerlo sin agregar los controladores de eventos en el constructor de todos modos, lo que no ayuda a la situación.

¿Alguna idea? ¿Alguien tiene una manera elegante de hacer lo que estoy tratando de hacer?

EDITAR : Gracias a sixlettervariables por la respuesta. Tomé esa idea y la incorporé a SoapBox Core y obtuve el resultado. Consulte el cuadro de diálogo Opciones para ver cómo funciona.

¿Fue útil?

Solución

¿Quizás mantener una lista de Acción s para ejecutar?

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

Luego actualice su código Commit para recorrer las acciones.

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

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

Otros consejos

¿Podría usar la reflexión para determinar qué propiedades tiene su clase e iterar a través de ellas?

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top