2011-03-26 76 views
0

我通常使用下面的绑定/代码来同步MVVM类型的主/从关联,以利用CollectionViewSource。DataGrid选择的列/单元格

对于DataGrid演示文稿,我有一组活动,它们是网格中的行。网格中的最后八列是给定活动的Allocation.Amounts集合。我使用CurrentCellChanged事件,其中我将该行的DataContext(到ActivityViewModel),然后使用网格的CurrentColumn属性来设置选定的项目(SelectedAllocationVm),使用后面的代码在网格中。它的作品,但...

我可以做得更好吗?就像我在下面做的行一样?

的ViewModels

class diagram

数据网格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 
+0

您可以改进的唯一一件事是在ActivityCollectionViewModel内添加SelectedActivity属性。但是对于选定的DataGrid列来说并不那么容易。 – vorrtex 2011-03-26 17:34:31

+0

@vortex。嘿,有涡流。它从类图中不是很明显,因为我将SelectedActivityVm显示为关联,但它在那里。是的,我找不出更简单的东西!你为什么不把这个答案写成答案,以便我可以接受它并关闭这个答案。干杯 – Berryl 2011-03-27 01:05:18

回答

0

涡流是正确的; DataGrid列选择并不像使用CollectionViewSource管理选定列那么简单。