【发布时间】:2011-03-26 15:05:29
【问题描述】:
我通常使用下面的绑定/代码来同步 MVVM 类型的主从关联,利用 CollectionViewSource。
对于 DataGrid 演示文稿,我有一组活动,它们是网格中的行。网格中的最后八列是 Allocation.Amounts 到给定 Activity 的集合。
我已经求助于在网格中使用代码,使用 CurrentCellChanged 事件,在该事件中我将行的 DataContext 转换为 ActivityViewModel,然后使用网格的 CurrentColumn 属性来设置所选项目 (SelectedAllocationVm)。它有效,但是......
我可以做得更好吗?类似于我在下面为行做的事情?
视图模型
DataGrid 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的列就不是那么容易了。
-
@vortex。嘿那里有漩涡。从类图中可能不那么明显,因为我将 SelectedActivityVm 显示为关联,但它就在那里。是的,我想不出更容易的事情!你为什么不把它变成一个答案,这样我就可以接受它并关闭它。干杯
标签: wpf silverlight datagrid master-detail