Làm cách nào để phát hiện bất kỳ thay đổi mục nào ngay lập tức trong chế độ xem danh sách trong WPF?

lập trình


Xin chào, tôi có một ứng dụng WPF nơi tôi sử dụng ListCollectionView làm ItemSource của ComboBox. ListCollectionView này chủ yếu được điền từ lớp AudioDevice. Thực ra, trước đây tôi đã tạo Danh sách dựa trên lớp AudioDevice. Listcollectionview của tôi hoạt động rất hoàn hảo. Nhưng tôi muốn phát hiện xem có bất kỳ thay đổi mục nào xảy ra trên đó khi chạy ứng dụng không?

Làm thế nào tôi có thể làm điều đó? một điểm quan trọng cần nhớ là tất cả những việc tôi làm từ Codebehind. Tôi không sử dụng bất kỳ kiến ​​trúc cơ sở MVVM nào trong trường hợp này.

Đây là đoạn mã của phần cuối cùng nơi tôi khai báo ListCollectionView.

ListCollectionView lcv = new(devices); lcv.GroupDescriptions.Add(new PropertyGroupDescription("Direction")); cmb1.ItemsSource = lcv;

Những gì tôi đã thử:

Tôi cố gắng giải quyết vấn đề này bằng cách sử dụng

INotifyCollectionChanged

nhưng mã đó không hoạt động và không thể phát hiện các thay đổi khi chạy.

Giải pháp 1

Tài liệu khá rõ ràng, nó liệt kê các sự kiện được hỗ trợ: Lớp ListCollectionView (System.Windows.Data) | Microsoft Tìm hiểu[^].

Trong trường hợp của bạn, bạn muốn nghe Bộ sưu tập đã thay đổi[^] sự kiện.

CẬP NHẬT

Đây là cách xử lý CollectionChanged sự kiện:

C#
private void OnCollectionChanged(
    object? sender,
    NotifyCollectionChangedEventArgs e)
{
    // any new items?
    if (e.NewItems?.Count > 0)
    {
        // Item(s) added
    }

    // any to remove? ... not required for this purpose.
    if (e.OldItems?.Count > 0)
    {
        // Item(s) removed
    }
}

Giải pháp 2

Tôi muốn nói rằng nó phụ thuộc vào loại bộ sưu tập devices biến là. Nếu nó chỉ là một List<> thì các thay đổi sẽ không được phản ánh trong giao diện người dùng vì List<> không phát ra sự kiện khi nội dung của nó thay đổi.

Bạn có thể có hai lựa chọn:

1) Bất cứ khi nào bạn nhận được bản cập nhật devices danh sách, bạn sẽ phải cập nhật hộp tổ hợp này bằng cách tạo một hộp tổ hợp mới ListCollectionView và gán nó cho cmb1.ItemsSource

2) Tạo một ObservableCollection<> và lưu trữ nó trong lớp. Sau đó bạn có thể tạo một ListCollectionView sử dụng bộ sưu tập có thể quan sát này làm nguồn, sau đó điền vào bộ sưu tập có thể quan sát được danh sách thiết bị. Điều này có nghĩa là bất kỳ thay đổi nào đối với bộ sưu tập có thể quan sát cũng sẽ được áp dụng cho ListCollectionView và sẽ áp dụng cho giao diện người dùng khi được cập nhật.

Tùy chọn thứ hai có thể phức tạp hơn vì nó có nghĩa là thêm, cập nhật và/hoặc xóa các mục trong bộ sưu tập có thể quan sát để khớp với những gì có trong devices danh sách. Nó có thể thuộc về bất kỳ lựa chọn nào có thể dễ dàng nhất cho bạn.

コメント

タイトルとURLをコピーしました