2009-03-22 18 views
8

Tôi đang làm việc với Silverlight và tôi muốn filer một ObservableCollection.Cách tạo một CollectionView cho ObservableCollection <T> trong Silverlight

Vì vậy, tôi bắt đầu xem xét ICollectionView, bởi vì không có CollectionViewSource trong Silverlight và nó chứa một số lượng không đầy đủ các phương thức và sự kiện. Tôi đã tìm kiếm một lúc và tôi tự hỏi liệu có ai có mã ví dụ về việc triển khai ICollectionView không?

Trả lời

1

Thật không may ICollectionView chỉ được sử dụng cho DataGrid trong Silverlight 2.0 và triển khai duy nhất của nó là ListCollectionView, nằm bên trong System.Windows.Controls.Data.

Nếu bạn không ràng buộc với DataGrid, ICollectionView sẽ không cung cấp cho bạn nhiều bởi vì nó không được sử dụng bởi các điều khiển cơ bản (như hộp danh sách) như tôi có thể nói, vì nó được xác định trong bộ điều khiển dữ liệu và không phải trong lõi.

Đây là sự khác biệt khá lớn với WPF.

Nhưng đến thời điểm câu hỏi của bạn, hội đồng có chứa DataGrid không có triển khai có thể giúp bạn nếu bạn muốn tìm hiểu cách thực hiện. Trường hợp xấu nhất, phản xạ là bạn của bạn ...

+3

hiện có sẵn trong Silverlight> = 3 –

1

Một phương pháp sẽ là sử dụng Trình chuyển đổi giá trị nếu bạn muốn kết nối dữ liệu với ObservableCollection.

phương pháp khác sẽ được sử dụng LINQ trong một đối tượng ViewModel CLR mà có thể làm việc lọc dựa trên thuộc tính trong ViewModel như thế này (xem UpdateFilteredStores phương pháp thực hiện() ở phía dưới):

namespace UnitTests 
{ 
    using System.Collections.Generic; 
    using System.Collections.ObjectModel; 
    using System.Collections.Specialized; 
    using System.ComponentModel; 
    using System.Linq; 

    public class ViewModel : INotifyPropertyChanged 
    { 
     private string name; 

     public ViewModel() 
     { 
      this.Stores = new ObservableCollection<string>(); 

      this.Stores.CollectionChanged += new NotifyCollectionChangedEventHandler(this.Stores_CollectionChanged); 

      // TODO: Add code to retreive the stores collection 
     } 

     #region INotifyPropertyChanged Members 

     public event PropertyChangedEventHandler PropertyChanged; 

     #endregion 

     public ObservableCollection<string> Stores { get; private set; } 

     public IEnumerable<string> FilteredStores { get; private set; } 

     public string Name 
     { 
      get 
      { 
       return this.name; 
      } 

      set 
      { 
       this.name = value; 

       if (this.PropertyChanged != null) 
       { 
        this.PropertyChanged(this, new PropertyChangedEventArgs("Name")); 
       } 

       this.UpdateFilteredStores(); 
      } 
     } 

     private void Stores_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e) 
     { 
      this.UpdateFilteredStores(); 
     } 

     private void UpdateFilteredStores() 
     { 
      this.FilteredStores = from store in this.Stores 
            where store.Contains(this.Name) 
            select store; 

      if (this.PropertyChanged != null) 
      { 
       this.PropertyChanged(this, new PropertyChangedEventArgs("FilteredStores")); 
      } 
     } 
    } 
} 
+0

Bạn có ví dụ về LINQ trong đối tượng CLM ViewModel không? –

+0

Tôi vừa cập nhật phản hồi của mình với một số mã mẫu. –

+1

Bạn không cần phải gọi 'UpdateFilteredStores' mỗi lần' Tên' được sửa đổi, LINQ sẽ tự động đánh giá lại yêu cầu. – Grokwik

6

CollectionViewSource hiện đã có trong Silverlight 3. Xem một bài viết hay về điều này here.

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