Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/263.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用MVVM在单击按钮时对列表框进行排序_C#_Wpf_Xaml_Mvvm - Fatal编程技术网

C# 使用MVVM在单击按钮时对列表框进行排序

C# 使用MVVM在单击按钮时对列表框进行排序,c#,wpf,xaml,mvvm,C#,Wpf,Xaml,Mvvm,从昨天起我就一直在寻找解决问题的办法。我用MVVM模式构建了一个问题。 我有两个usercontrol,它们都包含一个列表框 第一个usercontrol称为SearchView,它包含一个项目名称列表框,用户可以选择并保存到应用程序本地数据库 添加所选项目时,将触发一个事件,通知名为“ProjectView”的第二个usercontrol。此usercontrol仅显示本地保存的项目。如下图所示 问题是我希望能够在projectview中按名称升序排列列表框。因此,如果用户首先添加“测试项

从昨天起我就一直在寻找解决问题的办法。我用MVVM模式构建了一个问题。 我有两个usercontrol,它们都包含一个列表框

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

添加所选项目时,将触发一个事件,通知名为“ProjectView”的第二个usercontrol。此usercontrol仅显示本地保存的项目。如下图所示

问题是我希望能够在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");
     }
 }
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列表框的顶部。@EduardoBrites
System.Collections.ObjectModel.ObservableCollection
在哪里有一个
Sort()
methode?如何将
复选框
绑定到
ProjectWrapper
上的
IsAdded
属性。由于您的事件在第二个视图模型中被捕获,我会完全清除列表并重新构建它,就像
AddedProjects=OriginalProjects.Where(p=>p.IsAdded.OrderBy(p=>p.Name)
一样。这个答案非常有效!非常感谢!我有一个小问题。如果在项目名称的末尾有一个数字,你知道可以做什么吗。假设我有以下项目:测试项目1-10。现在的排序是这样的:测试项目1、测试项目10和测试项目2-9。