| using System; |
| using System.Collections.Generic; |
| using System.Linq; |
| using System.ComponentModel; |
| using System.Text; |
| using System.Windows; |
| using System.Windows.Data; |
| using Telerik.Windows; |
| using Telerik.Windows.Controls; |
| using Telerik.Windows.Controls.GridView; |
| using Telerik.Windows.Data; |
| |
| namespace WpfApplication1 |
| { |
| public class GridViewHeaderMenu |
| { |
| private RadGridView grid = null; |
| |
| public GridViewHeaderMenu(RadGridView grid) |
| { |
| this.grid = grid; |
| } |
| |
| public static readonly DependencyProperty IsEnabledProperty |
| = DependencyProperty.RegisterAttached("IsEnabled", typeof(bool), typeof(GridViewHeaderMenu), |
| new PropertyMetadata(new PropertyChangedCallback(OnIsEnabledPropertyChanged))); |
| |
| public static void SetIsEnabled(DependencyObject dependencyObject, bool enabled) |
| { |
| dependencyObject.SetValue(IsEnabledProperty, enabled); |
| } |
| |
| public static bool GetIsEnabled(DependencyObject dependencyObject) |
| { |
| return (bool)dependencyObject.GetValue(IsEnabledProperty); |
| } |
| |
| private static void OnIsEnabledPropertyChanged(DependencyObject dependencyObject, DependencyPropertyChangedEventArgs e) |
| { |
| RadGridView grid = dependencyObject as RadGridView; |
| if (grid != null) |
| { |
| if ((bool)e.NewValue) |
| { |
| // Create new GridViewHeaderMenu and attach RowLoaded event. |
| GridViewHeaderMenu menu = new GridViewHeaderMenu(grid); |
| menu.Attach(); |
| } |
| } |
| } |
| |
| private void Attach() |
| { |
| if (grid != null) |
| { |
| this.grid.Loaded += new RoutedEventHandler(grid_Loaded); |
| } |
| } |
| |
| void grid_Loaded(object sender, RoutedEventArgs e) |
| { |
| GridViewHeaderRow headerRow = grid.ChildrenOfType<GridViewHeaderRow>().FirstOrDefault(); |
| if (headerRow != null) |
| { |
| InitializeMenus(headerRow); |
| } |
| } |
| |
| private void InitializeMenus(GridViewHeaderRow row) |
| { |
| IEnumerable<GridViewHeaderCell> cells = row.Cells.OfType<GridViewHeaderCell>(); |
| |
| foreach (GridViewHeaderCell cell in cells) |
| { |
| // create menu |
| RadContextMenu contextMenu = new RadContextMenu(); |
| // set menu Theme |
| StyleManager.SetTheme(contextMenu, StyleManager.GetTheme(grid)); |
| |
| RadMenuItem item = new RadMenuItem() { Header = String.Format(@"Sort Ascending by ""{0}""", cell.Column.Header) }; |
| contextMenu.Items.Add(item); |
| |
| item = new RadMenuItem() { Header = String.Format(@"Sort Descending by ""{0}""", cell.Column.Header) }; |
| contextMenu.Items.Add(item); |
| |
| item = new RadMenuItem() { Header = String.Format(@"Clear Sorting by ""{0}""", cell.Column.Header) }; |
| contextMenu.Items.Add(item); |
| |
| item = new RadMenuItem() { Header = String.Format(@"Group by ""{0}""", cell.Column.Header) }; |
| contextMenu.Items.Add(item); |
| |
| item = new RadMenuItem() { Header = String.Format(@"Ungroup ""{0}""", cell.Column.Header) }; |
| contextMenu.Items.Add(item); |
| |
| item = new RadMenuItem() { Header = "Choose Columns:" }; |
| contextMenu.Items.Add(item); |
| |
| // create menu items |
| foreach (GridViewColumn column in grid.Columns) |
| { |
| RadMenuItem subMenu = new RadMenuItem() |
| { |
| Header = column.Header, |
| IsCheckable = true, |
| IsChecked = true |
| }; |
| |
| // bind IsChecked menu item property to IsVisible column property |
| subMenu.SetBinding(RadMenuItem.IsCheckedProperty, |
| new Binding("IsVisible") { Mode = BindingMode.TwoWay, Source = column }); |
| |
| item.Items.Add(subMenu); |
| } |
| |
| contextMenu.AddHandler(RadMenuItem.ClickEvent, new RoutedEventHandler(OnMenuItemClick)); |
| |
| // attach menu |
| RadContextMenu.SetContextMenu(cell, contextMenu); |
| } |
| } |
| |
| void OnMenuItemClick(object sender, RoutedEventArgs e) |
| { |
| RadContextMenu menu = (RadContextMenu)sender; |
| RadMenuItem clickedItem = ((RadRoutedEventArgs)e).OriginalSource as RadMenuItem; |
| GridViewColumn column = ((GridViewHeaderCell)menu.UIElement).Column; |
| |
| if (clickedItem.Parent is RadMenuItem) |
| return; |
| |
| string header = Convert.ToString(clickedItem.Header); |
| |
| using (grid.DeferRefresh()) |
| { |
| Telerik.Windows.Data.SortDescriptor sd = (from d in grid.SortDescriptors |
| where d.Member == column.UniqueName |
| select d).FirstOrDefault(); |
| |
| if (header.Contains("Sort Ascending")) |
| { |
| if (sd != null) |
| { |
| grid.SortDescriptors.Remove(sd); |
| } |
| |
| grid.SortDescriptors.Add(new Telerik.Windows.Data.SortDescriptor() |
| { |
| Member = column.UniqueName, |
| SortDirection = ListSortDirection.Ascending |
| }); |
| } |
| else if (header.Contains("Sort Descending")) |
| { |
| if (sd != null) |
| { |
| grid.SortDescriptors.Remove(sd); |
| } |
| |
| grid.SortDescriptors.Add(new Telerik.Windows.Data.SortDescriptor() |
| { |
| Member = column.UniqueName, |
| SortDirection = ListSortDirection.Descending |
| }); |
| } |
| else if (header.Contains("Clear Sorting")) |
| { |
| if (sd != null) |
| { |
| grid.SortDescriptors.Remove(sd); |
| } |
| } |
| else if (header.Contains("Group by")) |
| { |
| Telerik.Windows.Data.GroupDescriptor gd = (from d in grid.GroupDescriptors |
| where d.Member == column.UniqueName |
| select d).FirstOrDefault(); |
| |
| if (gd == null) |
| { |
| grid.GroupDescriptors.Add(new Telerik.Windows.Data.GroupDescriptor() { Member = column.UniqueName, SortDirection = ListSortDirection.Ascending }); |
| } |
| } |
| else if (header.Contains("Ungroup")) |
| { |
| Telerik.Windows.Data.GroupDescriptor gd = (from d in grid.GroupDescriptors |
| where d.Member == column.UniqueName |
| select d).FirstOrDefault(); |
| if (gd != null) |
| { |
| grid.GroupDescriptors.Remove(gd); |
| } |
| } |
| } |
| } |
| } |
| } |
| |