Использование кода позади только кнопки добавления в динамически генерируемый заголовок столбца WPF DataGrid - PullRequest
1 голос
/ 03 июня 2011

У меня есть таблица данных wpf, в которой столбцы динамически генерируются в коде, и мне нужно вставить маленькие кнопки в заголовок каждого столбца справа от текста, чтобы реализовать настраиваемую (сложную) фильтрацию во всплывающем диалоговом окне.

У меня проблемы с выяснением, как вставить кнопку в заголовок столбца таблицы данных, используя только код позади.

Это маршрут, по которому я начал спускаться (закомментированный), но он не работает:

private static DataGridTextColumn GetTextColumn(string ColumnName, string FormatString, bool AlignRight)
       {
           DataGridTextColumn c = new DataGridTextColumn();
           c.Header = Test.Common.UIBizObjectCache.LocalizedText.GetLocalizedText(ColumnName);
           c.Binding = new System.Windows.Data.Binding(ColumnName);
           if (!string.IsNullOrWhiteSpace(FormatString))
               c.Binding.StringFormat = FormatString;
           if (AlignRight)
           {
               Style cellRightAlignedStyle = new Style(typeof(DataGridCell));
               cellRightAlignedStyle.Setters.Add(new Setter(DataGridCell.HorizontalAlignmentProperty, HorizontalAlignment.Right));
               c.CellStyle = cellRightAlignedStyle;
           }

           //var buttonTemplate = new FrameworkElementFactory(typeof(Button));
           //buttonTemplate.Text = "X";
           //buttonTemplate.AddHandler(
           //                   Button.ClickEvent,
           //                   new RoutedEventHandler((o, e) => HandleColumnHeaderButtonClick(o, e))
           //               );
           //c.HeaderTemplate=new DataTemplate(){VisualTree = buttonTemplate};

           return c;
       }

Я получаю недопустимое исключение операции «Тип ContentPresenter должен реализовывать IAddChild для использования в FrameworkElementFactory AppendChild.»

Очевидно, что я делаю это неправильно.:) Любая помощь будет принята с благодарностью.

Ответы [ 2 ]

3 голосов
/ 03 июня 2011

Вам нужно использовать шаблон? Если не использовать обычное Header свойство:

string colProperty = "Name";

DataGridTextColumn col = new DataGridTextColumn();
col.Binding = new Binding(colProperty);
var spHeader = new StackPanel() { Orientation = Orientation.Horizontal };
spHeader.Children.Add(new TextBlock(new Run(colProperty)));
var button = new Button();
button.Click += Button_Filter_Click;
button.Content = "Filter";
spHeader.Children.Add(button);
col.Header = spHeader;

dataGrid.Columns.Add(col);
0 голосов
/ 11 июля 2019

Для создания заголовка столбца с кнопкой изображения, вы можете сделать это в xaml:

<Window.Resources>
        <BitmapImage x:Key="Img" UriSource="/Img/yourImage.png"/>
</Window.Resources>
        <Datagrid Name="yourDatagrid">
           <DataGrid.Columns>
                <DataGridTemplateColumn>
                    <DataGridTemplateColumn.CellTemplate>
                        <DataTemplate>
                            <Button x:Name="Btn" Click="Btn_Click" >
                                <DockPanel>
                                    <Image Source="{StaticResource ResourceKey=Img}" Height="16" Width="16"/>
                                </DockPanel>
                            </Button>
                        </DataTemplate>
                    </DataGridTemplateColumn.CellTemplate>
                </DataGridTemplateColumn>
            </DataGrid.Columns>
         </Datagrid>

Или вы можете автоматически сгенерировать это в следующем коде:

XAML:

<Window.Resources>
    <BitmapImage x:Key="Img" UriSource="/Img/yourImage.png"/>
</Window.Resources>

C #:

Datagrid yourDatagrid = new Datagrid();
DataGridTemplateColumn colBtn = new DataGridTemplateColumn();
DataTemplate DttBtn = new DataTemplate();
FrameworkElementFactory btn = new FrameworkElementFactory(typeof(Button));
FrameworkElementFactory panel = new FrameworkElementFactory(typeof(DockPanel));
FrameworkElementFactory img = new FrameworkElementFactory(typeof(Image));

        img.SetValue(Image.SourceProperty, (BitmapImage)FindResource("Img"));
        img.SetValue(Image.HeightProperty, Convert.ToDouble(16));
        img.SetValue(Image.WidthProperty, Convert.ToDouble(16));

        panel.AppendChild(img);
        btn.AppendChild(panel);
        btn.AddHandler(Button.ClickEvent, new RoutedEventHandler(Btn_Click));
        DttBtn.VisualTree = btn;
        colBtn.CellTemplate = DttBtn;
        yourDatagrid.Columns.Add(colBtn);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...