Связи WPF не обновляются - PullRequest
       12

Связи WPF не обновляются

0 голосов
/ 20 октября 2010

В моей форме есть список, который выглядит следующим образом:

<ListBox Name="lbResults" SelectionChanged="lbResults_SelectionChanged"/>

Я привязываю к нему следующую коллекцию:

ObservableCollection<Hand> oHands = new ObservableCollection<Hand>();

используя следующий код:

lbResults.DataContext = oHands;
Binding binding = new Binding();
lbResults.SetBinding(ListBox.ItemsSourceProperty, binding);

Коллекция oHands заполняется через фонового работника, который объявляет через событие всякий раз, когда доступен новый объект Hand. ListBox прекрасно обновляется, когда что-то добавляется. Результат ToString () объекта Hand отображается, и это то, что я хочу - пока все хорошо. Однако, когда фоновый работник заканчивает работу

void finder_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        {
            oHands = new ObservableCollection<Hand>(oHands.OrderBy(o => o.PotSize));
            lbResults.SetBinding(ListBox.ItemsSourceProperty, new Binding());
        }

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

Ответы [ 4 ]

1 голос
/ 20 октября 2010

вместо замены всей наблюдаемой коллекции, вы можете просто очистить ее и добавить все свои новые предметы. это не повлияет на вашу привязку.

Вы также можете использовать CollectionViewSource в качестве привязки и установить порядок в ней вместо переупорядочения всей коллекции.

1 голос
/ 20 октября 2010

Вы не хотите назначать oHands новую коллекцию. Просто очистите () коллекцию, затем добавьте результаты операции. не обновлять привязку

0 голосов
/ 20 октября 2010

Не проще ли установить источник напрямую?

lbResults.ItemsSource = oHands;
0 голосов
/ 20 октября 2010

Вы действительно просто должны наследовать от интерфейса INotifyPropertyChanged, но вот еще один способ принудительного обновления привязки:

BindingExpression exp = BindingOperations.GetBindingExpression(lbResults, Listbox.ItemsSourceProperty)
exp.UpdateTarget()

Редактировать: я также только что заметил васне устанавливаем никакой привязки в XAML и, кажется, делают это программно с пустой привязкой.Я не пробовал подобным образом раньше, поэтому посмотрим, может ли помочь изменение вашего XAML на это:

<ListBox Name="lbResults" SelectionChanged="lbResults_SelectionChanged" ItemsSource="{Binding Path=oHands}"/>

Затем вы устанавливаете lbResults.DataContext, чтобы указать на класс, в котором есть член oHands.Это то, что сработало для меня в моем проекте (в IronPython, так что простите, если мои примеры не конвертировались в C # идеально).

...