2009-07-23 2 views
2

Я пытаюсь разработать функциональность фильтрации для WPF DataGrid (из набора инструментов WPF). Я хочу, чтобы пользователь щелкнул правой кнопкой мыши по любой ячейке и выбрал Filter из своего CcontextMenu, а затем сетку нужно отфильтровать по значению ячейки.WPF DataGrid: Получить свойство связывания столбца для фильтрации

Я пытаюсь использовать шаблон M-V-VM. Мой datacontext моих окон - MainWindowViewModel, который имеет свойство Transactions. Это свойство возвращает ObservableCollection<TransactionViewModel>, а сетка данных использует эту коллекцию в качестве источника своих элементов. Таким образом, в основном каждая строка ограничена TransactionViewModel (как вы можете догадаться, эта сетка перечисляет транзакции). MainWindowsViewModel имеет ICollectionView, который используется для фильтрации и отслеживания текущей выбранной строки. У DataGrid есть свойство IsSynchronizedWithCurrentItem, установленное в «true», поэтому myCollectionView.CurrentItem дает мне выбранный в настоящее время TransactionViewModel.

Единственное, что мне еще нужно знать, - это тот столбец, который мне нужно отфильтровать. Это зависит от того, где пользователь нажал контекстное меню. Поэтому я пытаюсь передать эту информацию с помощью CommandProperty пункта контекстного меню. И здесь у меня настоящая проблема. Я попытался это:

CommandParameter="{Binding Column.Binding.Path.Path, 
             RelativeSource={RelativeSource FindAncestor, 
                 AncestorType={x:Type tk:DataGridCell}}}" /> 

Это действительно уродливые, но это работает для DataGridTextColumn с. К сожалению, у меня также есть DataGridTemplateColumn s, и они не работают (путь там другой, потому что мне нужно достичь фактического шаблона ячейки) ...

Как я могу реализовать эту функциональность? Возможно, весь путь неправильный? На этом я не нашел никакого ценного примера. Единственное, что я нашел, это реализация автофильтра WPF DataGrid на Codeproject, которая не работает вообще по какой-либо причине ...

Спасибо.

ответ

0

Я не 100% уверен, что это поможет, но ...

DataGrid имеет CurrentCell, чтобы вы могли связать его в режиме TwoWay в вашем MainWindowViewModel. Затем каждая «строка» может указывать на команду DoFilter, определенную в MainWindowViewModel. Это не решение для красоты (потому что viewmodel должен знать тип ячейки DataGrid), но он должен работать.

0

Почему не просто передать ячейки в качестве параметра, как это:

CommandParameter= 
    "{Binding RelativeSource={RelativeSource FindAncestor,tk:DataGridCell,1}}" /> 

и пусть Выполненное событие вашей команды в обрабатывать всю тяжелую часть поиска фактического имени столбца? Таким образом, вы можете написать весь код специального кода, который вам нужен.