私は昨日から自分の問題の解決策を探していました。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>
前もって感謝します