DataGrid выбранный столбец/ячейка

Обычно я использую приведенные ниже привязки/код для синхронизации ассоциации master-detail типа MVVM, используя преимущества CollectionViewSource.

Для презентации DataGrid у меня есть набор действий, которые представляют собой строки в сетке. Последние восемь столбцов в сетке представляют собой набор Allocation.Amounts для данного действия.

Я прибегал к использованию кода в сетке, используя событие CurrentCellChanged, где я приводил DataContext строки (в ActivityViewModel), а затем использовал свойство CurrentColumn сетки для установки выбранного элемента (SelectedAllocationVm). Это работает, но...

Могу ли я сделать лучше? Что-то вроде того, что я делаю ниже для строк?

ViewModels

диаграмма классов

XAML-привязки DataGrid

<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

person Berryl    schedule 26.03.2011    source источник
comment
Единственное, что вы можете улучшить, — это добавить свойство SelectedActivity внутрь ActivityCollectionViewModel. А вот с выделенным столбцом DataGrid не все так просто.   -  person vortexwolf    schedule 26.03.2011
comment
@вихрь. эй, вихрь. это не так очевидно, может быть, из диаграммы классов, потому что я показываю SelectedActivityVm как ассоциацию, но она там есть. да ничего проще не придумаю! почему бы вам не превратить это в ответ, чтобы я мог принять его и закрыть этот вопрос. Ваше здоровье   -  person Berryl    schedule 27.03.2011


Ответы (1)


вихрь был прав; Выбор столбца DataGrid не так прост, как управление выбранным столбцом с помощью CollectionViewSource.

person Berryl    schedule 02.04.2011