Pergunta

Eu tenho uma visão que mostra uma caixa de listagem que é obrigado a GetAll () :

<DockPanel>
    <ListBox ItemsSource="{Binding GetAll}"
             ItemTemplate="{StaticResource allCustomersDataTemplate}"
             Style="{StaticResource allCustomersListBox}">
    </ListBox>
</DockPanel>

GetAll () é uma propriedade ObservableCollection no meu ViewModel:

public ObservableCollection<Customer> GetAll
{
    get
    {
        return Customer.GetAll();
    }
}

que por sua vez chama um método GetAll () modelo que lê um arquivo XML para preencher o ObservableCollection:.

public static ObservableCollection<Customer> GetAll()
{
    ObservableCollection<Customer> customers = new ObservableCollection<Customer>();

    XDocument xmlDoc = XDocument.Load(Customer.GetXmlFilePathAndFileName());
    var customerObjects = from customer in xmlDoc.Descendants("customer")
                          select new Customer
                          {
                              Id = (int)customer.Element("id"),
                              FirstName = customer.Element("firstName").Value,
                              LastName = customer.Element("lastName").Value,
                              Age = (int)customer.Element("age")
                          };
    foreach (var customerObject in customerObjects)
    {
        Customer customer = new Customer();

        customer.Id = customerObject.Id;
        customer.FirstName = customerObject.FirstName;
        customer.LastName = customerObject.LastName;
        customer.Age = customerObject.Age;

        customers.Add(customer);
    }

    return customers;
}

Esta todas as obras bem, exceto quando o usuário vai para outro ponto de vista, edita o arquivo XML e volta para este ponto de vista em que os dados antigos ainda está mostrando .

Como posso saber essa visão para "atualizar suas ligações" para que ele mostra os dados reais.

Parece que eu vou sobre WPF aqui com muito de um HTML / HTTP metáfora, eu sinto que há uma maneira mais natural de obter ObservableCollection para se atualizar, daí o seu nome, mas esta é a única maneira que eu posso obter o usuário seja capaz de editar dados em um aplicativo WPF no momento. Assim ajuda em qualquer nível é apreciado aqui.

Foi útil?

Solução

Um ItemsControl solicita a sua ligação uma vez e armazena em cache a referência depois.

Se o conteúdo do objecto de recolha são modificados, e que implementa INotifyCollectionChanged (como ObservableCollection faz), ele irá pegar qualquer objecto adicionado ou removido.

Agora, se você quiser a ligação para fornecer um novo objeto de coleção para o ListBox, você pode ter sua visão de modelo de implementar INotifyPropertyChanged e PropertyChanged aumento, passando em GetAll como o nome da propriedade. Isto terá o efeito de aviso a ligação que o valor da propriedade mudou (há um novo ObservableCollection pronto para ser pego), que vai fornecer à ListBox, que vai voltar a gerar os seus itens.

Assim, enquanto você efeito muda de seu aplicativo, trabalhando no ObservableCollection retornado por GetAll, você pode adicionar e remover ea lista vai ficar em sincronia. Quando você quiser pegar modificações externas (que você pode ter um lugar botão de atualização, ou um ponto natural onde faz sentido para recarregar o arquivo inteiro), você pode ter sua visão de modelo de aumentar o evento PropertyChanged, que vai chamar a propriedade automaticamente getter, que irá chamar o método estático, que irá retornar uma nova coleção fresca.

Nitpicker nota: por que você dá nomes de métodos de propriedades

?

Outras dicas

A seguir o trabalho de linha mesmo que quando nós removemos a adicionar objeto na coleção:

CollectionViewSource.GetDefaultView(CustomObservableCollection).Refresh();

Mantenha uma referência ao seu ObservableCollection e última modificação do arquivo XML a partir do momento que você carregá-la. Sempre que a janela recebe foco, verificar o carimbo de hora no arquivo de disco. Se ele mudou, clara e re-preencher o ObservableCollection. A GUI é automaticamente escuta de eventos de alteração do ObservableCollection e vai voltar a preencher automaticamente quando você modifica o conteúdo da coleção.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top