Ho voluto associare a un ObservableCollection
in XAML e anche applicare il raggruppamento lì. In linea di principio, questo ha funzionato bene.Come posso ottenere il CollectionView definito in 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>
Poi i dati espressione di associazione divenne ItemsSource="{Binding Source={StaticResource ResourceKey=cvs}}"
invece di ItemsSource="{Binding Path=TestTemplates}"
.
All'inizio, tutto sembrava interessante, fino a quando non volevo aggiornare l'interfaccia utente dal modello di visualizzazione. Il problema è che CollectionViewSource.GetDefaultView(TestTemplates)
ha restituito una visualizzazione diversa da quella di XAML in cui è stato applicato il raggruppamento. Pertanto, non ho potuto impostare la selezione o fare qualcosa di utile con esso.
È possibile correggerlo legando nuovamente l'elenco direttamente alla proprietà del modello di visualizzazione e impostando il raggruppamento nel code-behind. Ma non sono così felice con questa soluzione.
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"));
}
}
Suppongo che il motivo sia già given by John Skeet here.
Tuttavia, mi aspetto che ci sia un modo per ottenere la vista giusta. Ho sbagliato?
Stai andando sul modo sbagliato. Una VM non dovrebbe avere alcuna conoscenza della vista. Se si desidera aggiornare la vista, assicurarsi che la proprietà a cui si lega sia ObservableCollection o che il proprio codice sollevi NotifyPropertyChanged esplicitamente quando si modifica la raccolta. –
@PanagiotisKanavos: la roba nella visualizzazione elenco in realtà * è * in un 'ObservableCollection' e gli elementi nell'interfaccia utente si aggiornano su una modifica di proprietà. Ma il gruppo non lo rispetta. Una soluzione nota è forzare l'aggiornamento, ad esempio "CollectionViewSource.GetDefaultView (...) .Refresh'. – primfaktor
In .NET 4.5, questo verrà risolto con [ICollectionViewLiveShaping] (http://msdn.microsoft.com/en-us/library/system.componentmodel.icollectionviewliveshaping (v = vs.110) .aspx). – primfaktor