自昨天开始,我一直在寻找解决方案。我正在使用MVVM模式构建一个问题。
我有两个用户控件,它们都包含一个列表框。
第一个用户控件称为SearchView,其中包含一个项目名称列表框,用户可以选择并保存到应用程序的本地数据库中。
当添加选定的项目时,会触发一个事件,通知名为“ProjectView”的第二个用户控件。该用户控件只显示本地保存的项目,如下图所示。
问题是,我想能够按名称升序排序项目视图中的列表框。这样,如果用户首先添加“Test Project 2”,然后再添加“Test Project 1”,则“Test Project 1”将显示在列表框的顶部。
我尝试使用ICollectionView和ListCollectionView,但目前非常困惑。
因此,现在我的代码看起来像这样,在需要对列表框进行排序的ProjectViewModel中:
我有两个用户控件,它们都包含一个列表框。
第一个用户控件称为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>
非常感谢您的提前帮助。
System.Collections.ObjectModel.ObservableCollection
这个类中在哪里可以找到Sort()
方法? - WiiMaxxCheckBox
与ProjectWrapper
上的IsAdded
属性绑定,如何呢?由于您的事件在第二个视图模型中被捕获,我会清除列表并重新构建它,例如AddedProjects = OriginalProjects.Where(p => p.IsAdded).OrderBy(p => p.Name)
。 - Michael Schnerring