2009-07-14 47 views
7

Tôi đang cố gắng để ràng buộc hai ListBox es:ListBox không làm mới sau khi sở hữu thay đổi

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

ApplicationsEvents là tài sản công cộng trong Window lớp.

tôi đặt DataContext để this cho cả hai hộp danh sách và thực hiện INotifyPropertyChanged trong Window lớp:

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

Và rồi sau khi thêm mục mới vào Applications hoặc Events tôi gọi:

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

Vấn đề là rằng ListBox chỉ được tải một lần. Tôi đang làm gì sai?

Trả lời

11

Hãy nhìn vào một trong các ListBox, vì chúng đều giống nhau, về cơ bản.

Mã chúng tôi quan tâm đến là:

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

Vì bạn là người mới đến WPF, hãy để tôi nói rằng bạn có thể không cần UpdateSourceTrigger hay Mode trong đó, mà lá chúng tôi với điều này:

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

Bạn đã đề cập rằng Ứng dụng là tài sản công khai trong mã của bạn. Bạn cần nó là DependencyProperty và bạn cần nó để kích hoạt sự kiện khi thay đổi - hầu hết mọi người sử dụng ObservableCollection cho việc này.

Vì vậy, code-behind của bạn sẽ có một cái gì đó giống như này:

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

Sau đó, nơi bạn muốn thêm vào nó, bạn sẽ làm điều gì đó như thế này:

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

Cuối cùng, để cú pháp ràng buộc "đơn giản" hoạt động trong XAML, tôi thường thay đổi DataContext trong Cửa sổ của tôi (hoặc phần tử Kiểm soát gốc cho tệp, bất kể thứ gì tôi đang làm việc) thành

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

Hộp Ứng dụng của bạn sẽ tự động cập nhật.

+0

Cảm ơn. Nó hoạt động, nhưng chỉ musst được đặt datacontext listbox = this hoặc ElementName = window trong {Binding}. –

+0

Điểm tốt. Tôi đã cập nhật câu trả lời. – exclsr

+3

Bạn không cần phải thực hiện bộ sưu tập của bạn, bạn đang ràng buộc với một thuộc tính phụ thuộc - miễn là nó là một ObservableCollection và loại trong bộ sưu tập thực hiện INotifyPropertyChanged – flobadob

3

Vấn đề là giá trị tài sản của bạn không thay đổi. Nó vẫn là cùng một danh sách, cùng một tham chiếu.

Một giải pháp có thể là các bộ sưu tập của bạn thuộc loại ObservableCollection. Các danh sách này cung cấp các sự kiện cho WPF khi bạn thêm hoặc xóa các mục.

Các vấn đề liên quan