Обычно я использую приведенные ниже привязки / код для синхронизации ассоциации типа мастер-деталь типа MVVM, используя преимущества CollectionViewSource.
Для презентации DataGrid у меня есть коллекция операций, которые представляют собой строки в сетке.Последние восемь столбцов в сетке являются коллекцией Allocation.Amounts для данного Activity.
Я прибег к использованию кода в сетке, используя событие CurrentCellChanged, где я приводил DataContext строки (кActivityViewModel), а затем используйте свойство CurrentColumn сетки для установки выбранного элемента (SelectedAllocationVm).Это работает, но ...
Могу ли я сделать лучше?Что-то вроде того, что я делаю ниже для строк?
ViewModels
DataGrid xaml bindings
<DataGrid
ItemsSource="{Binding ActivityVms}"
IsSynchronizedWithCurrentItem="True"
...
>
<DataGrid.Columns>
<ColumnSubclasses:TimeSheetTextColumn />
<!-- Days of the Week -->
<ColumnSubclasses:DayOfTheWeekColumn DowIndex="0" />
...
<ColumnSubclasses:DayOfTheWeekColumn DowIndex="6" />
<ColumnSubclasses:DaysOfTheWeekColumnTotal />
</DataGrid.Columns>
</DataGrid>
код синхронизации (ActivityCollectionViewModel)
#region Detail View Models & Selected Item
private ObservableCollection<ActivityViewModel> _activityVms;
private ICollectionView _collectionView;
void _setupCollections(ActivityCollectionComposite composite, IEntityValidator validator)
{
_activityVms = composite.ToActivityViewModels(validator);
// react to additions & deletions to the list
_activityVms.CollectionChanged += OnActivityCollectionChanged;
// retrieve the ICollectionView associated with the ObservableCollection
_collectionView = CollectionViewSource.GetDefaultView(_activityVms);
if (_collectionView == null) throw new NullReferenceException("_collectionView");
//listen to the CurrentChanged event to be notified when the selection changes
_collectionView.CurrentChanged += OnCollectionViewCurrentChanged;
}
private void OnCollectionViewCurrentChanged(object sender, EventArgs e)
{
NotifyOfPropertyChange(() => SelectedActivityVm);
}
/// <summary>Returns a collection of all the view models we know about.</summary>
public ObservableCollection<ActivityViewModel> ActivityVms
{
get { return _activityVms; }
}
public ActivityViewModel SelectedActivityVm
{
get {
return _collectionView.CurrentItem as ActivityViewModel;
}
}
#endregion