Pregunta

Estoy en una situación en la que una fuente externa me informa que una entidad en particular ha sido alterada fuera de mi contexto de datos actual. Puedo encontrar la entidad y llamar a actualizar así

MyDataContext.Refresh (RefreshMode.OverwriteCurrentValues, myEntity);

y las propiedades que se han modificado en la entidad se actualizan correctamente. Sin embargo, ninguno de los INotifyPropertyChanging INotifyPropertyChanged parecen aparecer cuando se produce la actualización y esto deja a mi interfaz de usuario mostrando información incorrecta.

Soy consciente de que Refresh () no utiliza los captadores y establecedores de propiedades correctos en la entidad para generar los eventos de notificación de cambio, pero ¿tal vez hay otra forma de lograr lo mismo?

¿Estoy haciendo algo mal? ¿Hay un método mejor que Actualizar? Si Actualizar es la única opción, ¿alguien tiene una solución?

¿Fue útil?

Solución

Tuve un problema similar. Estaba vinculado a un TreeView y necesitaba llamar a Actualizar en respuesta al usuario que cancelaba una operación de edición. El método Refresh () devuelve obedientemente todos los valores originales, pero esto no se reflejó en mi IU TreeView. Después de consultar con el todopoderoso Google, encontré esta solución:

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

Esto parece obligar a mi TreeView a actualizar todo. El único inconveniente (y es bastante importante) es que parece colapsar todos los nodos del árbol, lo que hace que el usuario pierda su lugar. También podría establecer mi ItemsSource en nulo y viceversa ... mismo efecto, aunque este método sería más simple si tuviera un montón de cuadros de texto enlazados o algo así, ya que no lo necesitaría para volver a enlazar cada uno.

¿Hay una solución mejor que esta?

EDITADO: Sí, hay ...

A un compañero de trabajo más inteligente que yo se le ocurrió esta solución, que parece ser la solución. En su clase parcial para el objeto Linq2Sql, agregue el siguiente código:

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

Puede llamar a esto en su código de aplicación:

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

Todos los elementos de la interfaz de usuario reciben el mensaje y se actualizan adecuadamente. Esto incluso funciona para controles de vista de árbol y cosas por el estilo en las que no desea que la interfaz de usuario aparezca para "restablecer" cuando actualices los enlaces.

Otros consejos

Si sabe llamar a Refresh (), ¿por qué no seguir adelante y actualizar la interfaz de usuario en ese momento?

PropertyChanging y PropertyChanged se invocan invocando al definidor en una clase de entidad generada por DBML LINQtoSQL. Llamar a Actualizar () no hace eso:

[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();
        }
    }
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top