Here is the the full demo, including user control and consuming code: http://www.filefactory.com/file/a06da5d/n/ContextMenuDemo_zip
I will try to break down the code in this post.
The column information in the datagrid is massaged into an ObservableCollection
1: public class OrderedItem : INotifyPropertyChanged
2: {
3: public event System.ComponentModel.PropertyChangedEventHandler PropertyChanged;
4:
5: private string _Name;
6: public string Name
7: {
8: get { return _Name; }
9: set
10: {
11: _Name = value;
12: if (PropertyChanged != null)
13: {
14: PropertyChanged(this, new PropertyChangedEventArgs("Name"));
15: }
16: }
17: }
18:
19: public string DisplayName { get; set; }
20: private int _Position;
21: public int Position
22: {
23: get { return _Position; }
24: set
25: {
26: _Position = value;
27: if (PropertyChanged != null)
28: {
29: PropertyChanged(this, new PropertyChangedEventArgs("Position"));
30: }
31: }
32: }
33:
34: private bool _IsFrozen;
35: public bool IsFrozen
36: {
37: get { return _IsFrozen; }
38: set
39: {
40: _IsFrozen = value;
41: if (PropertyChanged != null)
42: {
43: PropertyChanged(this, new PropertyChangedEventArgs("IsFrozen"));
44: }
45: }
46: }
47:
48: private bool _IsIncluded;
49: public bool IsIncluded
50: {
51: get { return _IsIncluded; }
52: set
53: {
54: _IsIncluded = value;
55: if (PropertyChanged != null)
56: {
57: PropertyChanged(this, new PropertyChangedEventArgs("IsIncluded"));
58: }
59: }
60: }
61:
62: public OrderedItem Copy()
63: {
64: return new OrderedItem
65: {
66: DisplayName = DisplayName,
67: IsIncluded = IsIncluded,
68: Name = Name,
69: Position = Position
70: };
71: }
72:
73: }
This method examines the datagrid and creates the ObservableCollection:
1: public void ShowLayoutDialog()
2: {
3: LayoutRoot.Visibility = Visibility.Visible;
4: List<ordereditem> ls = new List<ordereditem>();
5: for (int i = ZeroBasedStartIndex; i < GridToFormat.Columns.Count; i++)
6: {
7: var oi = new OrderedItem
8: {
9: Name = GridToFormat.Columns[i].Header.ToString(),
10: Position = GridToFormat.Columns[i].DisplayIndex + 1 - ZeroBasedStartIndex,
11: IsIncluded = (GridToFormat.Columns[i].Visibility == Visibility.Visible),
12: IsFrozen = GridToFormat.Columns[i].IsFrozen
13: };
14: oi.PropertyChanged += new PropertyChangedEventHandler(OrderedItem_PropertyChanged);
15: ls.Add(oi);
16: }
17: ls.Sort(new OrderedItemComparer());
18: ChooserGrid.ItemsSource = ls.ToObservableCollection<OrderedItem>();
19: }
Here is the method that applies the layout to the grid. InitLayout() and the Save-click handler method calls this method to do their heavy lifting.
1: private void UpdateGridLayout(OrderedItem[] layouts)
2: {
3: try
4: {
5: if (layouts != null)
6: {
7: int fc = (from l in layouts where l.IsFrozen select 1).Count();
8: GridToFormat.FrozenColumnCount = (fc > 0) ? fc + ZeroBasedStartIndex : 0;
9: foreach (OrderedItem layout in layouts)
10: {
11: foreach (DataGridColumn c in GridToFormat.Columns)
12: {
13: if (c.Header.ToString() == layout.Name)
14: {
15: c.Visibility = layout.IsIncluded ? Visibility.Visible : Visibility.Collapsed;
16: c.DisplayIndex = layout.Position - 1 + ZeroBasedStartIndex;
17: break;
18: }
19: }
20: }
21: }
22: else
23: {
24: for (int i = ZeroBasedStartIndex; i < GridToFormat.Columns.Count; i++)
25: {
26: GridToFormat.Columns[i].DisplayIndex = i;
27: GridToFormat.Columns[i].Visibility = Visibility.Visible;
28: }
29: }
30: }
31: catch
32: {
33: UpdateGridLayout(null);
34: _AppSettings[AppKey] = null;
35: _AppSettings.Save();
36: }
37: }
There are other methods that handle PropertyChanged event for the OrderedItem, and to handle user actions to movver the item up or down. I just want to point out what each method did, and I think the xaml and cs code (that can be downloaded from link in previous post) are pretty self-explanatory. I hope this gives you enough info about the the guts of the user-control to tweak it to your liking.
No comments:
Post a Comment