0
我通常使用下面的绑定/代码来同步MVVM类型的主/从关联,以利用CollectionViewSource。DataGrid选择的列/单元格
对于DataGrid演示文稿,我有一组活动,它们是网格中的行。网格中的最后八列是给定活动的Allocation.Amounts集合。我使用CurrentCellChanged事件,其中我将该行的DataContext(到ActivityViewModel),然后使用网格的CurrentColumn属性来设置选定的项目(SelectedAllocationVm),使用后面的代码在网格中。它的作品,但...
我可以做得更好吗?就像我在下面做的行一样?
的ViewModels数据网格XAML绑定
<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
您可以改进的唯一一件事是在ActivityCollectionViewModel内添加SelectedActivity属性。但是对于选定的DataGrid列来说并不那么容易。 – vorrtex 2011-03-26 17:34:31
@vortex。嘿,有涡流。它从类图中不是很明显,因为我将SelectedActivityVm显示为关联,但它在那里。是的,我找不出更简单的东西!你为什么不把这个答案写成答案,以便我可以接受它并关闭这个答案。干杯 – Berryl 2011-03-27 01:05:18