Как установить растяжение для TextBox в заголовке столбца в коде позади? - PullRequest
0 голосов
/ 09 ноября 2018

Я пытаюсь написать простую мульти-фильтрацию для сетки данных. Идея состоит в том, чтобы добавить TextBox к каждому заголовку столбца в сетке данных. Пользователь может ввести какое-то значение в каждый TextBox, и тогда строки в DataGrid будут отфильтрованы. Столбцы генерируются динамически. Я делаю это в коде позади. Чтобы добавить TextBox к заголовку столбца, я создал новый DataTemplate и назначил его для HeaderTemplate столбца, как показано ниже:

DataGridTextColumn column = new DataGridTextColumn();

FrameworkElementFactory textBox = new FrameworkElementFactory(typeof(TextBox));
textBox.SetValue(NameProperty, "exemplaryName");
textBox.SetValue(HorizontalAlignmentProperty, HorizontalAlignment.Stretch);

FrameworkElementFactory textBlock = new FrameworkElementFactory(typeof(TextBlock));
textBlock.SetValue(TextBlock.TextProperty, "exemplaryName");

FrameworkElementFactory stackPanel = new FrameworkElementFactory(typeof(StackPanel));

stackPanel.AppendChild(textBox);
stackPanel.AppendChild(textBlock);

DataTemplate headerTemplate = new DataTemplate();       
headerTemplate.VisualTree = stackPanel;
column.HeaderTemplate = headerTemplate;

temp.dataGrid.Columns.Add(column);

Недавний просмотр заголовков столбцов DataGrid:

В чем моя проблема. Когда я устанавливаю TextBox HorizontalAlignment значение «Растянуть», ничего не происходит. Как вы можете видеть на рисунке выше, столбцы имеют определенную ширину (это значение равно Auto), но TextBox HorizontalAlignment остается со значением по умолчанию.

Моя цель - растянуть эти текстовые поля, даже когда пользователь изменит размер столбца (перетаскивая влево или вправо).

Как установить значение TextBox HorizontalAlignment для растяжения? Где мне чего-то не хватает? Требуется ли какое-либо дополнительное связывание или какой-либо другой механизм для получения растяжения при изменении ширины столбца?

1 Ответ

0 голосов
/ 09 ноября 2018

Используйте ColumnHeaderStyle, который устанавливает HorizontalContentAlignment в true:

<DataGrid x:Name="dataGrid">
    <DataGrid.ColumnHeaderStyle>
        <Style TargetType="{x:Type DataGridColumnHeader}">
            <Setter Property="HorizontalContentAlignment" Value="Stretch" />
        </Style>
    </DataGrid.ColumnHeaderStyle>
</DataGrid>

Вы можете создать Style в коде, если вам нужно:

const string Xaml = "<Style xmlns=\"http://schemas.microsoft.com/winfx/2006/xaml/presentation\" xmlns:x=\"http://schemas.microsoft.com/winfx/2006/xaml\" TargetType=\"{x:Type DataGridColumnHeader}\"><Setter Property=\"HorizontalContentAlignment\" Value=\"Stretch\" /></Style>";
temp.dataGrid.ColumnHeaderStyle = XamlReader.Parse(Xaml) as Style;
...