2012-07-27 29 views
5

Tôi có một số mã trong một hàm tạo cho một UserFrol WPF. Về cơ bản tôi thiết lập một ràng buộc với một XmlDataProvider (dữ liệu của tôi là năng động). Sau đó tôi muốn đặt CustomSort trên khung nhìn để trở thành MySorter (triển khai IComparer).CollectionViewSource.GetDefaultView trả về null ngay sau khi SetBinding

Vấn đề là GetDefaultView trả về null nếu được gọi trực tiếp sau cuộc gọi SetBinding - như thể có một số xử lý không đồng bộ đang diễn ra để thiết lập ItemsSource. Lưu ý rằng nếu tôi gọi cùng một mã GetDefaultView sau đó trong một nút Nhấn xử lý nó hoạt động tốt, nó không trả về null và cơ chế sắp xếp tất cả các công trình tốt và dandy.

MyListBox.SetBinding(ListBox.ItemsSourceProperty, binding); 

ListCollectionView view = CollectionViewSource.GetDefaultView(MyListBox.ItemsSource) as ListCollectionView; 

view.CustomSort = new MySorter(); // falls over - view is null 

Câu hỏi của tôi là, tại sao không GetDefaultView trở lại null khi gọi trực tiếp sau khi SetBinding, là có một sự kiện tôi cần phải chờ đợi trước khi tôi gọi GetDefaultView và nhận được một phản ứng không null?

+1

Nó có thể giúp để biết được nơi mã này là gì? Có lẽ bản thân ràng buộc là 'null' tại thời điểm này. – user7116

+2

Tôi đã thực hiện một lỗi đánh máy trong bài viết gốc của mình (hiện đã được sửa), xin lỗi. Users.ItemsSource trong GetDefaultView thực sự là cùng một MyListBox có bộ ràng buộc trong dòng đầu tiên. Do đó tại sao MyListBox.ItemsSource không phải là null. – user1558012

Trả lời

3

Có phải Users.ItemsSource an ItemCollection của bạn không? Sau đó, có thể xem cũng sẽ là một ItemCollection vì nó kế thừa từ CollectionView.

CollectionViewSource.GetDefaultView trả về số ICollectionView. Có nhiều lớp hơn chỉ được kế thừa từ CollectionView sau đó chỉ ListCollectionView. Đảm bảo dàn diễn viên của bạn không thành công, ví dụ: với mã này:

var view = CollectionViewSource.GetDefaultView(Users.ItemsSource); 
Console.WriteLine(view.GetType()); 
+1

Tôi đã thực hiện một lỗi đánh máy trong bài đăng gốc của mình (hiện đã được sửa), xin lỗi. Users.ItemsSource trong GetDefaultView thực sự là cùng một MyListBox có bộ ràng buộc trong dòng đầu tiên. Do đó tại sao MyListBox.ItemsSource không phải là null. Các diễn viên không thất bại khi được gọi trong một xử lý sự kiện Click sau đó vì vậy tôi không nghĩ rằng đó là một vấn đề đúc. Cảm ơn. – user1558012

+0

Mã của tôi (có chỉnh sửa) hiển thị là gì ?. Kiểm tra theo thứ tự này nếu MyListBox.ItemsSource là Null và nếu CollectionViewSource.GetDefaultView (MyListBox.ItemsSource) là Null. – LPL

+0

MyListBox.ItemsSource là null ... Tuy nhiên nó là không null trong một nút Click handler ngay sau - như thể nó đã không hoàn thành ràng buộc khi nó trở về từ cuộc gọi SetBinding? Có một số lượng dữ liệu hợp lý trong XmlDataProvider nhưng nó vẫn tồn tại trong chưa đầy một giây. – user1558012

0

Điều này xảy ra khi XmlDataProvider được sử dụng. GetDefaultView không trả về null khi DataContext được thiết lập từ một cá thể đối tượng từ mã. Tuy nhiên khi sử dụng XmlDataProvider, GetDefaultView trả về null. Tôi thấy rằng bởi vì cho đến khi xml được tải nó trả về null.

Do đó nếu CollectionViewSource.GetDefaultView được gọi từ phương thức xử lý sự kiện của sự kiện "Đã tải", nó hoạt động tốt.

public MainWindow() 
    { 
     InitializeComponent(); 
     this.comboBox1.Loaded += new RoutedEventHandler(ComboBoxLoaded);   
    } 

    private void ComboBoxLoaded(object sender, RoutedEventArgs e) 
    { 
     ListCollectionView view = (ListCollectionView)CollectionViewSource.GetDefaultView(((XmlDataProvider)this.myGrid.DataContext).Data); 
     view.SortDescriptions.Add(new SortDescription("Location", ListSortDirection.Ascending)); 
    }  

Bạn có thể tìm thấy ví dụ này theo liên kết này (dưới sân khấu 8):

http://wpfgrid.blogspot.com/2013/01/simple-combobox-implementation.html

+0

Chúng tôi đã nhìn thấy những dịp ngẫu nhiên mà 'CollectionViewSource.GetDefaultView' sẽ trả về 'null' nhưng không thể hiểu tại sao. Tôi nghĩ đây là câu trả lời. – karmasponge