ListBox не обновляется после изменения свойства - PullRequest
6 голосов
/ 14 июля 2009

Я пытаюсь связать два ListBox es:

<ListBox SelectionChanged="lbApplications_SelectionChanged"
         ItemsSource="{Binding Path=Applications, 
                       UpdateSourceTrigger=PropertyChanged, Mode=OneWay}" />
<ListBox DisplayMemberPath="Message" 
         ItemsSource="{Binding Path=Events, 
                       UpdateSourceTrigger=PropertyChanged, Mode=OneWay}" />

Applications и Events являются открытыми объектами класса Window.

Я установил DataContext в this для обоих списков и внедрил INotifyPropertyChanged в Window класс:

 private void NotifyPropertyChanged(string info)
 {
   if (PropertyChanged != null)
     PropertyChanged(this, new PropertyChangedEventArgs(info));
 }

А потом после добавления нового предмета в Applications или Events я звоню:

 NotifyPropertyChanged("Events");
 NotifyPropertyChanged("Applications");

Проблема в том, что ListBox загружается только один раз. Что я делаю не так?

Ответы [ 2 ]

11 голосов
/ 14 июля 2009

Давайте просто посмотрим на один из списков, поскольку они в основном одинаковы.

Код, который нас интересует, таков:

<ListBox ItemsSource="{Binding Path=Applications, 
                           UpdateSourceTrigger=PropertyChanged, Mode=OneWay}" />

Поскольку вы новичок в WPF, позвольте мне сказать, что вам, вероятно, не нужны UpdateSourceTrigger или Mode, что оставляет нас с этим:

<ListBox ItemsSource="{Binding Path=Applications}" />

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

Так что у вашего кода будет что-то вроде это:

public ObservableCollection<string> Applications
{
    get { return (ObservableCollection<string>)GetValue(ApplicationsProperty); }
    set { SetValue(ApplicationsProperty, value); }
}

public static readonly DependencyProperty ApplicationsProperty =
    DependencyProperty.Register("Applications", 
    typeof(ObservableCollection<string>), typeof(Window1), 
    new UIPropertyMetadata(null));

Затем, где вы хотите добавить это, вы будете делать что-то вроде этого:

this.Applications = new ObservableCollection<string>();
Applications.Add("Whatever");

Наконец, чтобы «простой» синтаксис привязки работал в XAML, я обычно меняю DataContext в моем окне (или корневой элемент управления для файла, где бы я ни работал) на

<Window DataContext="{Binding RelativeSource={RelativeSource Self}}" ... >
   ...

Окно приложений будет обновляться автоматически.

3 голосов
/ 14 июля 2009

Проблема в том, что стоимость вашего имущества не изменилась. Это все тот же список, та же ссылка.

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

...