2010-02-11 20 views

Trả lời

15

Vấn đề là giao diện INotifyCollectionChanged trong đó có xử lý sự kiện được thực hiện một cách rõ ràng, có nghĩa là bạn phải đầu tiên cast ItemCollection trước khi xử lý sự kiện có thể được sử dụng:

public MyWindow() 
{ 
    InitializeComponent(); 

    ((INotifyCollectionChanged)mListBox.Items).CollectionChanged += 
     mListBox_CollectionChanged; 
} 

private void mListBox_CollectionChanged(object sender,  
    NotifyCollectionChangedEventArgs e) 
{ 
    if (e.Action == NotifyCollectionChangedAction.Add) 
    { 
     // scroll the new item into view 
     mListBox.ScrollIntoView(e.NewItems[0]); 
    }  
} 

Ref.

Lời khuyên của Josh về bộ sưu tập quan sát cũng nên được xem xét.

+0

Cảm ơn Mitch! Nó đã làm việc! Tuy nhiên, tôi đã gặp phải lỗi kỳ lạ này. Listbox được liên kết với một CollectionViewSource nơi nguồn là một XMLDocument. Tôi đã chỉ định XPath là .XPath = "/ RootNode/ChildNode". Lỗi lạ là "đôi khi" khi tôi khởi chạy ứng dụng của mình, hiển thị hộp danh sách, nó chứa một mục (NÊN không) và khi tôi đã kiểm tra ListBoxItem, mục nằm trong XMLDocument có trong nó "" Điều này xảy ra 2/5 lần. Tôi đã đăng câu hỏi trước đó để tôi biết khi nào một mục được quảng cáo nhưng không phải là một ứng dụng lạ, tôi nhận một NotifyCollectionChangedAction.Reset – lionheart

+0

Khó nói mà không thấy mã điền vào tài liệu XML. Có lẽ nó đã làm với tải async. Nhưng tôi vẫn tin rằng bạn đang chiến đấu chống lại một mô hình WPF đang cố gắng hướng dẫn bạn vào bằng cách đào sâu vào bên trong của ItemCollection. Bạn thực sự không bao giờ thậm chí phải suy nghĩ về ItemCollection hoặc ListBoxItem trừ khi bạn đang viết một điều khiển. – Josh

+0

Có cách nào để lấy container ('mListBox') khỏi sự kiện' private void mListBox_CollectionChanged (đối tượng người gửi, NotifyCollectionChangedEventArgs e) 'bằng cách sử dụng' sender' có thể? – Bolu

2

Thực hiện một cách tiếp cận khác. Tạo một ObservableCollection (có một số event) và đặt ItemsSource của ListBox thành bộ sưu tập này. Nói cách khác, trong WPF bạn nên suy nghĩ về vấn đề khác nhau. Kiểm soát không nhất thiết là những gì đang được sửa đổi ... bộ sưu tập đằng sau nó.

CẬP NHẬT
Dựa trên nhận xét của bạn vào câu trả lời của Mitch mà chỉ nguồn ràng buộc của bạn thực sự là một tài liệu XML, tôi khuyên bạn nên nhìn vào hooking đến sự kiện XObject.Changed của tài liệu XML/yếu tố/etc. Điều này sẽ cung cấp cho bạn thông tin thay đổi về chính cấu trúc XML - không phải là ItemCollection, một chi tiết triển khai mà bạn không cần phải xem xét. Ví dụ: ItemCollection (hoặc bất kỳ INotifyCollectionChanged) nào không đảm bảo một sự kiện riêng lẻ cho mọi thay đổi. Như bạn đã lưu ý, đôi khi bạn sẽ chỉ nhận được thông báo đặt lại chung.

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