2013-05-03 50 views
6

從昨天開始,我一直在爲我的問題尋找解決方案。我建立一個MVVM模式的問題。 我有兩個用戶控件,它們都包含一個列表框。當使用MVVM單擊按鈕時對列表框進行排序

第一個用戶控件叫做SearchView,它包含項目名稱列表框,用戶可以選擇並保存到應用程序本地數據庫。

enter image description here

當選擇的項目增加了一個事件,通知其被命名爲「ProjectView」第二個用戶控件被觸發。這個用戶控件只顯示哪些項目在本地保存。見下圖。

enter image description here

的問題是,我希望能夠排序在projectview列表框中上升的名字。因此,如果用戶首先添加「測試項目2」,後綴添加「測試項目1」,則「測試項目1」顯示在列表框的頂部。

我試圖使用ICollectionView和ListCollectionView,但我現在非常困惑。

所以現在我的代碼看起來像這樣,在需要進行排序列表框的ProjectViewModel:

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"); 
    } 
} 

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> 

在此先感謝

+1

這是否(http:// st ackoverflow.com/questions/1280704/how-can-i-sort-a-listbox-using-only-xaml-and-no-code-behind)爲你解決了什麼問題? – 2013-05-03 10:47:43

+0

爲什麼不在你的projectwrapper類中實現IComparable接口,然後你使用Projects.Sort()? – 2013-05-03 10:55:09

+0

是的,我一直在看這個問題,並嘗試相同的。但它沒有正確排列我的列表。如果我添加了Project 3,然後Proejct 2,它的排序是正確的 - > Project 1,然後是Project 3.但是當Project 2被添加時,應該在兩個項目的middel中,它被添加到了直列表框的頂部。 – mskydt86 2013-05-03 11:04:26

回答

2

調用這個時候你將元素添加到Projects列表中

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

這個答案真的很棒!非常感謝!我有一個後續問題。如果在項目名稱末尾有一個數字,你知道可以做些什麼嗎?假設我有以下項目:測試項目1 - 10.現在的排序是這樣的:測試項目1,測試項目10和測試項目2 - 9。 – mskydt86 2013-05-03 11:27:05

+0

試試這個爲你的後續問題。 http://stackoverflow.com/questions/6396378/c-sharp-linq-orderby-numbers-that-are-string-and-you-cannot-convert-them-to-int – 2013-05-03 20:08:04

0

你可以使用LINQ

樣品:既然你想要的名稱排序

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

 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

應該當您在XAML改變SortDescription足夠該項目,我認爲它是一樣的,你用在綁定的TextBlock {Binding Path=ProjectModel.Name}

相關問題