Tôi muốn liên kết với một số ObservableCollection
trong XAML và cũng áp dụng nhóm đó. Về nguyên tắc, điều này làm việc tốt.Tôi làm cách nào để có được CollectionView được xác định trong XAML
<UserControl.Resources>
<CollectionViewSource x:Key="cvs" Source="{Binding Path=TestTemplates}">
<CollectionViewSource.SortDescriptions>
<scm:SortDescription PropertyName="Title"/>
</CollectionViewSource.SortDescriptions>
<CollectionViewSource.GroupDescriptions>
<PropertyGroupDescription PropertyName="TestCategory"/>
</CollectionViewSource.GroupDescriptions>
</CollectionViewSource>
</UserControl.Resources>
Sau đó, biểu thức ràng buộc dữ liệu trở thành ItemsSource="{Binding Source={StaticResource ResourceKey=cvs}}"
thay vì ItemsSource="{Binding Path=TestTemplates}"
.
Lúc đầu, mọi thứ có vẻ thú vị, cho đến khi tôi muốn làm mới giao diện người dùng từ mô hình chế độ xem. Vấn đề là, CollectionViewSource.GetDefaultView(TestTemplates)
trả về một chế độ xem khác với chế độ xem từ XAML nơi áp dụng nhóm. Vì vậy, tôi không thể thiết lập lựa chọn hoặc làm bất cứ điều gì hữu ích với nó.
Tôi có thể sửa lỗi bằng cách liên kết trực tiếp danh sách với thuộc tính của mô hình chế độ xem và thiết lập nhóm trong mã sau. Nhưng tôi không hài lòng với giải pháp này.
private void UserControlLoaded(object sender, RoutedEventArgs e)
{
IEnumerable source = TemplateList.ItemsSource;
var cvs = (CollectionView)CollectionViewSource.GetDefaultView(source);
if (cvs != null)
{
cvs.SortDescriptions.Add(new SortDescription("Title", ListSortDirection.Ascending));
cvs.GroupDescriptions.Add(new PropertyGroupDescription("TestCategory"));
}
}
Tôi giả sử, lý do là đã là given by John Skeet here.
Tuy nhiên, tôi hy vọng rằng sẽ có cách để có được chế độ xem phù hợp. Liệu tôi có sai?
Bạn đang đi sai đường. Một máy ảo không có kiến thức về chế độ xem. Nếu bạn muốn cập nhật chế độ xem, hãy đảm bảo thuộc tính mà nó liên kết là một ObservableCollection hoặc mã của bạn tăng NotifyPropertyChanged một cách rõ ràng khi sửa đổi bộ sưu tập. –
@PanagiotisKanavos: Nội dung trong chế độ xem danh sách thực tế * là * trong 'ObservableCollection' và các mục trong giao diện người dùng thực hiện cập nhật về thay đổi thuộc tính. Nhưng nhóm không tôn trọng điều đó. Giải pháp được biết là buộc cập nhật, tức là 'CollectionViewSource.GetDefaultView (…) .Refresh'. – primfaktor
Trong .NET 4.5, điều này sẽ được khắc phục với [ICollectionViewLiveShaping] (http://msdn.microsoft.com/en-us/library/system.componentmodel.icollectionviewliveshaping (v = vs.110) .aspx). – primfaktor