2009-08-14 26 views
36

Tôi cần phải sắp xếp các chuỗi trong một ListBox, nhưng nó bị ràng buộc vào mô hình khung nhìn bởi một thành phần khác thông qua DataContext. Vì vậy, tôi không thể trực tiếp khởi tạo mô hình khung nhìn trong XAML, như trong this example, sử dụng ObjectDataProvider.Làm cách nào để sắp xếp một ListBox chỉ sử dụng XAML và không có mã-đằng sau?

Trong XAML của tôi:

<ListBox ItemsSource="{Binding CollectionOfStrings}" /> 

Trong mô hình quan điểm của tôi:

public ObservableCollection<string> CollectionOfStrings 
{ 
    get { return collectionOfStrings; } 
} 

Trong thành phần khác:

view.DataContext = new ViewModel(); 

Không có mã sau! Vì vậy, bằng cách sử dụng hoàn toàn XAML, làm thế nào tôi sắp xếp các mục trong ListBox? Một lần nữa, XAML không sở hữu sự khởi tạo của mô hình khung nhìn.

Trả lời

80

Sử dụng một CollectionViewSource:

<CollectionViewSource x:Key="SortedItems" Source="{Binding CollectionOfStrings}" 
    xmlns:scm="clr-namespace:System.ComponentModel;assembly=Win‌​dowsBase"> 
    <CollectionViewSource.SortDescriptions> 
     <scm:SortDescription PropertyName="SomePropertyOnYourItems"/> 
    </CollectionViewSource.SortDescriptions> 
</CollectionViewSource> 

<ListBox ItemsSource="{Binding Source={StaticResource SortedItems}}"/> 

Bạn có thể muốn quấn dây của bạn trong một VM lớp tùy chỉnh để bạn có thể dễ dàng hơn áp dụng hành vi phân loại.

+1

Cảm ơn, Kent! Ràng buộc thuộc tính Nguồn trên một CollectionViewSource là liên kết còn thiếu cho tôi. Tôi đánh giá cao nó. Trong trường hợp này, tôi không muốn một lớp VM tùy chỉnh, vì vậy tôi chỉ cần rời khỏi thuộc tính PropertyName, mà dường như làm việc cho các bộ sưu tập chuỗi tốt. –

+4

Ngoài ra, với bất kỳ người xem nào, thẻ SortDescription có thuộc tính Direction. –

+3

Điều gì sẽ xảy ra nếu ListBox là một phần của DataTemplate đại diện cho thuộc tính của một đối tượng là danh sách các mục. Tôi không thể phân loại bên trong ListBox bằng cách nào đó? –

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