2009-07-14 13 views
7

Próbuję powiązać dwa ListBox es:ListBox nie odświeżać po własności zmieniło

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

Applications i Events właściwości publicznych w Window klasie.

ustawić DataContext do this do obu pól listy i wdrożyć INotifyPropertyChanged w Window Klasa:

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

A potem po dodaniu nowego elementu do Applications lub Events wzywam:

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

Problem jest ten ListBox jest ładowany tylko jeden raz. Co ja robię źle?

Odpowiedz

11

Spójrzmy tylko na jeden z ListBoxów, ponieważ są one zasadniczo takie same.

Kod jesteśmy zaniepokojeni jest taka:

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

Ponieważ jesteś nowy, WPF, pozwól mi powiedzieć, że prawdopodobnie nie potrzebują UpdateSourceTrigger lub Mode tam, który pozostawia nas z tego:

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

Wspominałeś, że aplikacje są własnością publiczną w Twoim kodzie źródłowym. Musisz go mieć jako DependencyProperty i potrzebujesz go do wywoływania zdarzeń, kiedy się zmienia - większość ludzi używa do tego celu ObservableCollection.

Więc twój kod z opóźnieniem będzie miał coś jak tym:

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

Następnie, w którym chcesz go dodać, że zrobisz coś takiego:

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

Wreszcie, dla "prostej" składni wiążącej do pracy w XAML, zazwyczaj zmieniam DataContext w moim Oknie (lub głównym elemencie Kontrolnym dla pliku, cokolwiek pracuję) na

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

Twoje aplikacje zostaną automatycznie zaktualizowane.

+0

Dzięki. Działa, ale tylko musst należy ustawić listbox datacontext = this lub ElementName = okno w {Binding}. –

+0

Dobra uwaga. Zaktualizowałem odpowiedź. – exclsr

+3

Nie trzeba tworzyć powiązanej kolekcji z właściwością zależności - o ile jest to ObservableCollection i typ w narzędziach kolekcji INotifyPropertyChanged – flobadob

3

Problem polega na tym, że wartość właściwości nie uległa zmianie. To wciąż ta sama lista, to samo odniesienie.

Jednym z rozwiązań może być to, że Twoje kolekcje są typu ObservableCollection. Listy te zawierają zdarzenia dla WPF podczas dodawania lub usuwania elementów.

Powiązane problemy