2009-07-14 18 views
7

İki ListBox es bağlamaya çalışıyorum:Özellik değiştikten sonra ListBox yenilenmez

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

Applications ve EventsWindow sınıfındaki genel özelliklerdir.

DataContext öğesini this olarak her iki liste kutusuna ayarlıyorum ve Window sınıfında INotifyPropertyChanged uygulayın:

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

Ve sonra Applications veya Events öğesine yeni öğe ekledikten sonra:

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

ListBox sadece bir kez yüklenir. Neyi yanlış yapıyorum?

cevap

11

ListBox'lardan birine bakalım, çünkü ikisi de aynı, temelde.

biz endişe konum kod şudur: Eğer WPF için yeni olduğuna göre

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

, beni muhtemelen bu bize bırakır, orada UpdateSourceTrigger veya Mode gerekmez diyelim:

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

Uygulamalar'ın kod arkasındaki bir ortak özellik olduğunu belirtmiştiniz. Bir DependencyProperty olması gerekiyor ve değişiklikler olduğunda olayları tetiklemek için buna ihtiyacınız var - çoğu kişi bunun için bir ObservableCollection kullanıyor. Son olarak

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

: böyle bir şey yapacağım, sonra

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

, bunu eklemek istiyorum:

Yani arkada kod böyle bir şey olacak XAML'de çalışacak "basit" ciltleme sözdizimi için, genellikle DataContext'u Penceremde (veya çalışmakta olduğum dosya için kök Denetim öğesi)

Uygulamalar kutunuz otomatik olarak güncellenir.

+0

Teşekkürler. Çalışır, ancak sadece musst liste kutusu datacontext = bu veya ElementName = {Binding} penceresinde ayarlanır. –

+0

İyi nokta. Cevabı güncelledim. – exclsr

+3

Koleksiyonunuzu bir bağımlılık özelliğine bağlı hale getirmenize gerek yok - bir ObservableCollection olduğu sürece ve koleksiyondaki tür INotifyPropertyChanged'i uygular – flobadob

3

Sorun, özellik değerinizin değişmemiş olmasıdır. Hala aynı liste, aynı referans.

Koleksiyonlardan biri, koleksiyonlarınızın türü ObservableCollection olabilir. Öğeleri eklediğinizde veya kaldırdığınızda bu listeler WPF için etkinlikler sağlar.

İlgili konular