6

从昨天开始,我一直在寻找解决问题的方法。我用 MVVM 模式构建了一个问题。我有两个用户控件,它们都包含一个列表框。

第一个用户控件称为 SearchView,其中包含项目名称列表框,用户可以选择并保存到应用程序本地数据库中。

在此处输入图像描述

添加选定项目时,会触发一个事件,通知名为“ProjectView”的第二个用户控件。此用户控件仅显示本地保存的项目。见下图。

在此处输入图像描述

问题是我希望能够在项目视图中按名称升序对列表框进行排序。因此,如果用户首先添加“Test Project 2”,然后添加“Test Project 1”,则“Test Project 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>

提前致谢

4

3 回答 3

2

当您将元素添加到Projects列表时调用它

Projects = new ObservableCollection<ProjectWrapper>(Projects.OrderBy(x => x.Name));
于 2013-05-03T10:55:52.207 回答
0

你可以使用 Linq

样本:

        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; }
}
于 2013-05-03T11:00:18.470 回答
0

将 XAML 中的 SortDescription 更改为:

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

由于您想按项目名称排序,我认为它与您在 TextBlock 绑定中使用的名称相同{Binding Path=ProjectModel.Name}

于 2013-05-03T11:10:53.633 回答