Pregunta

Tengo una vista que muestra un cuadro de lista que está vinculado a GetAll () :

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

GetAll () es una propiedad de ObservableCollection en mi ViewModel:

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

que a su vez llama a un método modelo GetAll () que lee un archivo XML para completar la colección Observable:

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

Todo esto funciona bien EXCEPTO cuando el usuario va a otra vista, edita el archivo XML y vuelve a esta vista donde todavía se muestran los datos antiguos .

¿Cómo puedo indicar a esta vista que " actualice sus enlaces " para que muestre los datos reales.

Siento que estoy hablando de WPF con una metáfora HTML / HTTP, siento que hay una forma más natural de hacer que ObservableCollection se actualice, de ahí su nombre, pero esta es la única forma en que puedo obtener El usuario podrá editar los datos en una aplicación WPF en este momento. Así que la ayuda en cualquier nivel es apreciada aquí.

¿Fue útil?

Solución

Un ItemsControl solicita su enlace una vez y almacena en caché la referencia posteriormente.

Si el contenido del objeto de colección se modifica, e implementa INotifyCollectionChanged (como hace ObservableCollection ), recogerá cualquier objeto agregado o eliminado.

Ahora, si desea que el enlace proporcione un nuevo objeto de colección al ListBox , puede hacer que su implemento del modelo de vista INotifyPropertyChanged y elevar PropertyChanged , pasando GetAll como nombre de la propiedad. Esto tendrá el efecto de advertir al enlace que el valor de la propiedad ha cambiado (hay un nuevo ObservableCollection listo para ser recogido), que suministrará al ListBox , que volverá a generar sus elementos.

Entonces, mientras efectúes cambios desde tu aplicación, trabajando en el ObservableCollection devuelto por GetAll , puedes agregar y eliminar, y la lista permanecerá sincronizada. Cuando desee recoger modificaciones externas (puede que tenga un botón de actualización en algún lugar, o un punto natural donde tenga sentido volver a cargar todo el archivo), puede hacer que su modelo de vista genere el evento PropertyChanged , que llamará automáticamente al captador de propiedades, que llamará al método estático, que devolverá una nueva colección nueva.

Nota de Nitpicker: ¿por qué asigna nombres de métodos a las propiedades?

Otros consejos

La línea inferior funciona igual que cuando eliminamos para agregar un objeto en la colección:

CollectionViewSource.GetDefaultView(CustomObservableCollection).Refresh();

Guarde una referencia a su ObservableCollection y la última vez que se modificó el archivo XML desde el momento en que lo cargó. Siempre que la ventana se enfoque, verifique la marca de tiempo en el archivo de disco. Si ha cambiado, borre y vuelva a llenar el ObservableCollection . La GUI está escuchando automáticamente los eventos de cambio de ObservableCollection y se rellenará automáticamente cuando modifique el contenido de la colección.

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