DataGrid выбранный столбец / ячейка - PullRequest
0 голосов
/ 26 марта 2011

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

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

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

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

ViewModels

class diagram

DataGrid xaml bindings

<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

1 Ответ

0 голосов
/ 02 апреля 2011

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

...