Pergunta

Eu estou em uma situação onde eu estou sendo informado de uma fonte externa que uma entidade particular foi alterado fora da minha datacontext atual. Eu sou capaz de encontrar a entidade e atualização chamada como assim

MyDataContext.Refresh (RefreshMode.OverwriteCurrentValues, MyEntity);

e as propriedades que tenham sido alterados na entidade são atualizados corretamente. No entanto nenhum dos INotifyPropertyChanging INotifyPropertyChanged parecem ser levantadas quando a atualização ocorre e isso deixa minha UI exibindo informações incorretas.

Estou ciente de que Refresh () não consegue usar os getters de propriedade corretos e setters na entidade para levantar os eventos de notificação de alteração, mas talvez haja outra maneira de fazer a mesma coisa?

Estou fazendo algo errado? Existe um método melhor do que Atualizar? Se Refrescar é a única opção, alguém tem um trabalho em torno?

Foi útil?

Solução

Eu tive um problema semelhante. Eu estava de ligação a um TreeView e precisava chamar Atualizar em resposta ao usuário cancelar uma operação de edição. O método Refresh() obedientemente coloca todos os valores originais de volta, mas isso não se refletiu no meu TreeView UI. Após consulta com o todo-poderoso Google, me deparei com esta solução:

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

Este parece forçar meu TreeView para atualizar tudo. A única desvantagem (e é uma muito grande um) é que parece entrar em colapso todos os nós da árvore, o que faz com que o usuário perder o seu lugar. Eu poderia muito bem definir a minha ItemsSource como nulo e de volta ... mesmo efeito, embora este método seria mais simples se você tinha um monte de caixas de texto ligado ou alguma coisa, desde que você não precisa religar cada um.

Existe uma solução melhor do que isso?

EDITADO: Sim, há ...

A mais inteligente do que a mim colega meu veio com essa solução, que parece estar a fazer o truque. Em sua classe parcial para o objeto Linq2Sql, adicione o seguinte código:

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

O que você pode simplesmente chamar isso no código do aplicativo:

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

Todos UI receber a mensagem, e atualizar-se adequadamente. Isso funciona mesmo para controles TreeView e coisas assim, onde você não quer que a interface do usuário para parecer "reset" quando você atualizar as ligações.

Outras dicas

Se você sabe para chamar Refresh (), porque não basta ir em frente e atualizar a UI nesse ponto, afinal?

PropertyChanging e PropertyChanged são invocados invocando o setter em uma classe de entidade LINQtoSQL DBML gerado. Chamando Refresh () não faz isso:

[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 em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top