private static void BuildLegend(Type type, DataGrid grid, ResourceDictionary resources, Panel legend, string context) { if (legend == null) { return; } var labels = from p in type.GetProperties() from StyleAttribute a in p.GetCustomAttributes(typeof(StyleAttribute), true) where grid.Columns.Any(c => IsApplicable(c, a)) && (String.IsNullOrEmpty(a.Context) || context == a.Context) orderby a.Description let key = LegendKey(type, p) let style = resources[key] as Style where style != null select ConnectEdit(new Label { Style = style, Tag = "generated" + grid.Name, Name = a.GetName(p) + "LegendItem", }); if (legend.Children.Count == 0) { var header = new StackPanel { Orientation = Orientation.Horizontal }; header.Children.Add(new Label { Content = "Подсказка", Padding = new Thickness(5, 0, 5, 0), VerticalAlignment = VerticalAlignment.Center }); var toggleButton = new ToggleButton { Content = "+", ToolTip = "Свернуть\\развернуть", Padding = new Thickness(5, 0, 5, 0), Margin = new Thickness(0), Background = Brushes.Transparent, BorderBrush = Brushes.Transparent, Focusable = false, }; header.Children.Add(toggleButton); legend.Children.Add(header); var stack = new LegendPanel(); stack.BindTo <bool>("IsOverflow", toggleButton, ToggleButton.VisibilityProperty, x => x ? Visibility.Visible : Visibility.Collapsed); stack.BindTo <bool>("IsCollapsed", toggleButton, ToggleButton.ContentProperty, x => x ? "+" : "-"); toggleButton.BindTo <bool?>("IsChecked", stack, LegendPanel.IsCollapsedProperty, x => !x.GetValueOrDefault()); stack.Children.AddRange(labels); legend.Children.Add(stack); } else { //если пользовательские стили изменились нужно перестроить легенду var panel = legend.Children.OfType <LegendPanel>().First(); panel.Children.OfType <FrameworkElement>().Where(c => Equals("generated" + grid.Name, c.Tag)) .ToArray() .Each(c => panel.Children.Remove(c)); panel.Children.AddRange(labels); } }