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); |
} |
} |
} |
} |
} |
} |
|