【问题标题】:DataGrid selected column / cellDataGrid 选定的列/单元格
【发布时间】: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


【解决方案1】:

漩涡是对的; DataGrid 列选择不像使用 CollectionViewSource 管理选定的列那么容易。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多