2009-07-23 77 views
2

我正在嘗試爲WPF DataGrid(來自WPF工具包)開發過濾功能。我想要一個用戶右鍵單擊任何單元格,然後從CcontextMenu中選擇Filter,然後應根據單元格的值過濾網格。WPF DataGrid:獲取列綁定屬性進行過濾

我正在嘗試M-V-VM模式。我的windows的datacontext是MainWindowViewModel,它有一個屬性Transactions。此屬性返回ObservableCollection<TransactionViewModel>,並且數據網格將此集合用作其項目源。所以基本上每行都有TransactionViewModel(正如你所猜測的,這個網格列出了交易)。 MainWindowsViewModelICollectionView,用於過濾和跟蹤當前選中的行。 DataGrid的屬性IsSynchronizedWithCurrentItem設置爲「true」,所以myCollectionView.CurrentItem給我當前選擇的TransactionViewModel

我唯一需要知道的是我需要過濾哪一列。這取決於用戶點擊上下文菜單的位置。所以我試圖通過上下文菜單項的CommandProperty來傳遞這些信息。在這裏,我有一個真正的問題。我試過這個:

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

這真的很醜,但是這個適用於DataGridTextColumn s。不幸的是,我也DataGridTemplateColumn s,他們不工作(路徑是不同的,因爲我需要達到實際的單元格模板)...

那麼我怎麼能實現這個功能?也許整個過程都是錯誤的?我沒有找到任何有價值的例子。我唯一發現的是WPF DataGrid自動過濾器在Codeproject上的實現,由於某種原因根本不工作...

謝謝。

回答

0

我不是100%肯定這是否會幫助,但...

DataGrid中有CurrentCell,所以你可以在你的MainWindowViewModel在雙向模式綁定。 然後每個「行」都可以指向在MainWindowViewModel中定義的DoFilter命令。這不是一個美麗的解決方案(因爲viewmodel必須知道DataGrid單元格類型),但它應該工作。

0

爲什麼不通過小區像這樣的參數:

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

,讓你的命令的執行的事件處理髮現實際的列名的所有困難的部分?這樣你可以編寫你需要的所有特例代碼。