6

私は昨日から自分の問題の解決策を探していました。MVVMパターンで問題を構築しています。リストボックスを含む2つのユーザーコントロールを取得しました。

最初のユーザーコントロールは SearchView と呼ばれ、プロジェクト名のリストボックスを含み、ユーザーはそれを選択してアプリケーションのローカルデータベースに保存できます。

ここに画像の説明を入力

選択したプロジェクトが追加されると、「ProjectView」という名前の 2 番目のユーザー コントロールに通知するイベントが発生します。このユーザー コントロールは、どのプロジェクトがローカルに保存されているかを示すだけです。下の写真を見てください。

ここに画像の説明を入力

問題は、プロジェクトビューで名前の昇順でリストボックスをソートできるようにしたいということです。そのため、ユーザーが最初に「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 に答える