C# 使用MVVM在单击按钮时对列表框进行排序
从昨天起我就一直在寻找解决问题的办法。我用MVVM模式构建了一个问题。 我有两个usercontrol,它们都包含一个列表框 第一个usercontrol称为SearchView,它包含一个项目名称列表框,用户可以选择并保存到应用程序本地数据库 添加所选项目时,将触发一个事件,通知名为“ProjectView”的第二个usercontrol。此usercontrol仅显示本地保存的项目。如下图所示 问题是我希望能够在projectview中按名称升序排列列表框。因此,如果用户首先添加“测试项目2”并在后面添加“测试项目1”,则“测试项目1”将显示在列表框的顶部 我曾尝试使用ICollectionView和ListCollectionView,但目前我真的很困惑 现在我的代码如下所示,在ProjectViewModel中,需要对列表框进行排序:C# 使用MVVM在单击按钮时对列表框进行排序,c#,wpf,xaml,mvvm,C#,Wpf,Xaml,Mvvm,从昨天起我就一直在寻找解决问题的办法。我用MVVM模式构建了一个问题。 我有两个usercontrol,它们都包含一个列表框 第一个usercontrol称为SearchView,它包含一个项目名称列表框,用户可以选择并保存到应用程序本地数据库 添加所选项目时,将触发一个事件,通知名为“ProjectView”的第二个usercontrol。此usercontrol仅显示本地保存的项目。如下图所示 问题是我希望能够在projectview中按名称升序排列列表框。因此,如果用户首先添加“测试项
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");
}
}
publicprojectviewmodel(){
this.collectionView=CollectionViewSource.GetDefaultView(this.Projects);
}
私有ObservableCollection_项目=新ObservableCollection();
公共收集项目
{
获取{return\u project;}
设置
{
_项目=价值;
房地产变更(“项目”);
}
}
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>
提前感谢在将元素添加到
项目
列表时调用此选项
Projects = new ObservableCollection<ProjectWrapper>(Projects.OrderBy(x => x.Name));
Projects=newobserveCollection(Projects.OrderBy(x=>x.Name));
您可以使用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; }
}
var coll=新的ObservableCollection();
coll.Add(新的myItem(){Id=0,Name=“zz”});
coll.Add(新的myItem(){Id=3,Name=“bb”});
coll.Add(new myItem(){Id=1,Name=“aa”});
var sortedById=来自coll中的项目
orderby item.Id
选择项目;
var sortedByName=来自coll中的项目
orderby item.Name
选择项目;
coll=新的可观察收集(sortedById);
coll=新的可观察集合(sortedByName);
类myItem
{
公共int Id{get;set;}
公共字符串名称{get;set;}
}
将XAML中的SortDescription更改为:
<scm:SortDescription PropertyName="ProjectModel.Name" />
由于您希望按项目名称排序,我认为这与您在TextBlock的绑定中使用的相同
{binding Path=ProjectModel.name}
这()对您有帮助吗?为什么不在projectwrapper类中实现IComparable接口,然后执行项目。sort()是的,我一直在看那个问题,也试过同样的方法。但我的名单排序不正确。如果我先添加项目3,然后添加项目2,则排序正确-->项目1,然后添加项目3。但是,当添加项目2时,它应该位于两个项目的中间位置,它会被添加到til列表框的顶部。@EduardoBritesSystem.Collections.ObjectModel.ObservableCollection
在哪里有一个Sort()
methode?如何将复选框
绑定到ProjectWrapper
上的IsAdded
属性。由于您的事件在第二个视图模型中被捕获,我会完全清除列表并重新构建它,就像AddedProjects=OriginalProjects.Where(p=>p.IsAdded.OrderBy(p=>p.Name)
一样。这个答案非常有效!非常感谢!我有一个小问题。如果在项目名称的末尾有一个数字,你知道可以做什么吗。假设我有以下项目:测试项目1-10。现在的排序是这样的:测试项目1、测试项目10和测试项目2-9。