Как получить ItemsSource для обновления своей привязки? - PullRequest
10 голосов
/ 30 апреля 2009

У меня есть представление, которое показывает список, связанный с GetAll () :

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

GetAll () является свойством ObservableCollection в моей ViewModel:

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

, который, в свою очередь, вызывает метод модели GetAll () , который читает файл XML для заполнения 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;
}

Все это прекрасно работает, ЗА ИСКЛЮЧЕНИЕМ, когда пользователь переходит в другое представление, редактирует XML-файл и возвращается к этому представлению, где старые данные все еще показывают .

Как я могу сказать этому представлению "обновить свои привязки", чтобы оно отображало фактические данные.

Такое ощущение, что я собираюсь рассказать о WPF здесь со слишком большой метафорой HTML / HTTP, я чувствую, что есть более естественный способ заставить ObservableCollection обновлять себя, отсюда и его имя, но это единственный способ, которым я могу получить пользователь должен иметь возможность редактировать данные в приложении WPF на данный момент. Так что помощь на любом уровне ценится здесь.

Ответы [ 3 ]

12 голосов
/ 30 апреля 2009

ItemsControl запрашивает свою привязку один раз и после этого кэширует ссылку.

Если содержимое объекта коллекции изменено и оно реализует INotifyCollectionChanged (как это делает ObservableCollection), оно подберет любой добавленный или удаленный объект.

Теперь, если вы хотите, чтобы привязка предоставляла новый объект коллекции для ListBox, вы можете использовать вашу модель представления INotifyPropertyChanged и повысить PropertyChanged, передав GetAll в качестве имени свойства. Это приведет к предупреждению привязки об изменении значения свойства (есть новый ObservableCollection, готовый для получения), который он будет передавать в ListBox, который будет повторно генерировать его элементы.

Так что, пока вы вносите изменения в свое приложение, работая с ObservableCollection, возвращаемым GetAll, вы можете добавлять и удалять, и список будет синхронизирован. Когда вы хотите получить внешние изменения (у вас может быть кнопка обновления где-нибудь или естественная точка, в которой имеет смысл перезагрузить весь файл), вы можете заставить вашу модель представления вызвать событие PropertyChanged, которое автоматически вызовет свойство get, которое вызовет статический метод, который вернет новую новую коллекцию.

Примечание Nitpicker: почему вы даете имена методов свойствам

7 голосов
/ 10 апреля 2013

Работа под строкой работает так же, как при удалении, чтобы добавить объект в коллекцию:

CollectionViewSource.GetDefaultView(CustomObservableCollection).Refresh();
0 голосов
/ 30 апреля 2009

Сохраните ссылку на ваш ObservableCollection и время последнего изменения XML-файла на момент загрузки. Всякий раз, когда окно фокусируется, проверьте временную метку на диске. Если это изменилось, очистите и снова заполните ObservableCollection. Графический интерфейс автоматически прослушивает события изменения из ObservableCollection и будет автоматически заполняться при изменении содержимого коллекции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...