从昨天开始,我一直在为我的问题寻找解决方案。我正在构建MVVM模式的问题。 我有两个usercontrol,它们都包含一个列表框。
第一个usercontrol称为SearchView,它包含项目名称列表框,用户可以选择并保存到应用程序本地数据库。
当添加所选项目时,会触发一个事件,该事件通知名为“ProjectView”的第二个usercontrol。此用户控件只显示本地保存的项目。见下图。
问题是我希望能够在项目视图中按名称升序列表框。因此,如果用户首先添加“测试项目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>
提前致谢
答案 0 :(得分:2)
将元素添加到Projects
列表
Projects = new ObservableCollection<ProjectWrapper>(Projects.OrderBy(x => x.Name));
答案 1 :(得分: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; }
}
答案 2 :(得分:0)
将XAML中的SortDescription更改为:
时应该足够了<scm:SortDescription PropertyName="ProjectModel.Name" />
由于您希望按项目名称排序,我认为它与您在TextBlock {Binding Path=ProjectModel.Name}