2013-05-03 37 views
6

Tôi đã tìm kiếm giải pháp cho vấn đề của mình kể từ hôm qua. Im xây dựng một vấn đề với mô hình MVVM. Tôi có hai usercontrol, cả hai đều chứa một listbox.Sắp xếp một hộp danh sách khi một nút được bấm bằng cách sử dụng MVVM

Điều khiển người dùng đầu tiên được gọi là SearchView chứa một hộp danh sách tên dự án, mà người dùng có thể chọn và lưu vào db ứng dụng cục bộ.

enter image description here

Khi dự án được lựa chọn được thêm vào một sự kiện là bắn mà thông báo cho usercontrol 2 được đặt tên là "ProjectView". Điều này usercontrol chỉ đơn giản là cho thấy các dự án được lưu cục bộ. Nhìn vào hình dưới đây.

enter image description here

Vấn đề là tôi muốn để có thể loại ListBox tăng dần theo tên trong projectview. Vì vậy, nếu người dùng đầu tiên thêm "Test Project 2" và afterwords thêm "Test Project 1" thì "Test Project 1" được hiển thị ở phía trên cùng của hộp danh sách.

Tôi đã cố gắng sử dụng ICollectionView và ListCollectionView nhưng im thực sự rất bối rối vào lúc này.

Bây giờ Mã của tôi trông như thế này, trong ProjectViewModel mà cần phải sắp xếp ListBox:

public ProjectViewModel() { 
    this.collectionView = CollectionViewSource.GetDefaultView(this.Projects); 
} 

private ObservableCollection<ProjectWrapper> _project = new ObservableCollection<ProjectWrapper>(); 
public ObservableCollection<ProjectWrapper> Projects 
{ 
    get { return _project; } 
    set 
    { 
     _project = value; 
     OnPropertyChanged("Projects"); 
    } 
} 

mã XAML:

<UserControl.Resources> 
    <CollectionViewSource x:Key="cvs" Source="{Binding Path=Projects}"> 
     <CollectionViewSource.SortDescriptions> 
      <scm:SortDescription PropertyName="ProjectWrapper.Project.Name" /> 
     </CollectionViewSource.SortDescriptions> 
    </CollectionViewSource> 
</UserControl.Resources> 

<ListBox Name="ProjectsList" ItemsSource="{Binding Source={StaticResource cvs}}" SelectedItem="{Binding Path=SelectedProject}" HorizontalContentAlignment="Stretch" BorderThickness="0" Grid.Row="1" Grid.RowSpan="3" Margin="0,0.4,-0.2,27.8"> 
     <ListBox.ItemTemplate> 
      <DataTemplate> 
       <DockPanel> 
        <TextBlock Text="{Binding Path=ProjectModel.Name}" HorizontalAlignment="Left" VerticalAlignment="Center" Padding="3,2,0,0" /> 
        <CheckBox IsChecked="{Binding Path=IsSelected, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" HorizontalAlignment="Right" VerticalAlignment="Center" Padding="0,2,5,0" Margin="0,2.5,0,0" /> 
       </DockPanel> 
      </DataTemplate> 
     </ListBox.ItemTemplate> 
    </ListBox> 

Cảm ơn trước

+1

Điều này (http: // st ackoverflow.com/questions/1280704/how-can-i-sort-a-listbox-using-only-xaml-and-no-code-behind) làm sáng tỏ cho bạn? –

+0

Tại sao bạn không thực hiện giao diện IComparable trong lớp projectwrapper của bạn và sau đó bạn làm Projects.Sort()? –

+0

Vâng tôi đã nhìn vào câu hỏi đó, và cố gắng như vậy. Nhưng nó không phân loại danh sách của tôi đúng cách. Nếu tôi thêm Project 3, và sau đó Proejct 2 nó được sắp xếp đúng -> Project 1, sau đó là Project 3. Nhưng sau đó khi Project 2 được thêm vào nên nằm trong middel của hai dự án, nó sẽ được thêm vào đầu danh sách til . – mskydt86

Trả lời

2

cuộc gọi này khi bạn thêm phần tử vào danh sách Projects

Projects = new ObservableCollection<ProjectWrapper>(Projects.OrderBy(x => x.Name)); 
+0

Câu trả lời này hoạt động thực sự tuyệt vời! Cảm ơn rất nhiều! Tôi có một câu hỏi nhỏ.Bạn có biết những gì có thể được thực hiện nếu bạn có một số ở cuối tên dự án. Giả sử tôi có các dự án sau: Test Project 1 - 10. Vì bây giờ việc phân loại là như sau: Test Project 1, Test Project 10 và Test Project 2 - 9. – mskydt86

+0

thử cho câu hỏi tiếp theo của bạn. http://stackoverflow.com/questions/6396378/c-sharp-linq-orderby-numbers-that-are-string-and-you-cannot-convert-them-to-int –

0

bạn có thể sử dụng LINQ

mẫu:

 var coll = new ObservableCollection<myItem>(); 
     coll.Add(new myItem() { Id = 0, Name = "zz" }); 
     coll.Add(new myItem() { Id = 3, Name = "bb" }); 
     coll.Add(new myItem() { Id = 1, Name = "aa" }); 

     var sortedById = from item in coll 
         orderby item.Id 
         select item; 

     var sortedByName = from item in coll 
         orderby item.Name 
         select item; 

     coll = new ObservableCollection<myItem>(sortedById); 
     coll = new ObservableCollection<myItem>(sortedByName); 

class myItem 
{ 
    public int Id { get; set; } 
    public string Name { get; set; } 
} 
0

Nó phải đủ khi bạn thay đổi SortDescription trong XAML của bạn để:

<scm:SortDescription PropertyName="ProjectModel.Name" /> 

Vì bạn muốn sắp xếp theo tên của dự án, nơi tôi nghĩ nó giống như bạn sử dụng trong sự ràng buộc của TextBlock {Binding Path=ProjectModel.Name}

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