Центрировать содержимое в поле со списком в столбце datagridcomboboxcolumn через xaml в стиле

мой первый вопрос, так что будьте осторожны. Я несколько дней пытался в этом разобраться. Самое близкое, что у меня получилось, - это программный доступ к содержимому ячейки в коде. Есть ли способ сделать это в xaml?

Например, это не работает

<Style x:Key="ComboBox" TargetType="DataGridCell">
    <Setter Property="FontSize" Value="14"/>
    <Setter Property="FontWeight" Value="SemiBold"/>
    <Setter Property="HorizontalAlignment" Value="Center"/>
    <Setter Property="HorizontalContentAlignment" Value="Center"/>
</Style>

<DataTemplate x:Key="foo">
    <Border Margin="3">
        <DataGrid Style="{StaticResource DGStyle}" Block.TextAlignment="Center">
           <DataGrid.Columns>
                <DataGridComboBoxColumn Header="bar" SelectedItemBinding="{Binding ListofIntegers, Mode=TwoWay}" 
                    ItemsSource="{Binding Source={StaticResource fooItem}, Path=ListofBar, Mode=OneWay}" CellStyle="{StaticResource ComboBox}" TextBlock.TextAlignment="Center"/>                    
                </DataGrid.Columns>
        </DataGrid>
    </Border>
</DataTemplate>

Я пробовал еще несколько вещей, так как смог центрировать заголовки и текстовые поля в столбцах текстовых полей. Однако выпадающие списки не хотят сотрудничать со мной. Кто-нибудь знает как?

Изменить: Хорошо, теперь чувствую себя глупо, играл с решением Энди и наткнулся на это

<Style x:Key="BasicComboBox" TargetType="ComboBox">
        <Setter Property="HorizontalContentAlignment" Value="Center"/>
        <Setter Property="ItemContainerStyle">
            <Setter.Value>
                <Style TargetType="ComboBoxItem">
                    <!--can mess with appearance of drop down menu here-->
                </Style>
            </Setter.Value>
        </Setter>
    </Style>

<DataGridComboBoxColumn Header="Size" HeaderStyle="{StaticResource Header}"  SelectedItemBinding="{Binding Size.Name, Mode=TwoWay}" 
  ItemsSource="{Binding Source={StaticResource InsertSizes}}" EditingElementStyle="{StaticResource BasicComboBox}"/>

Можно установить стиль созданного поля со списком в EditingElementStyle.

Изменить 2: Хотя все вышесказанное работает, я думаю, что я собираюсь пойти с предложением Энди использовать столбец шаблона, поля со списком также не сливаются с сеткой, но их гораздо проще выбрать для пользователя, так как там Нет необходимости переходить в режим редактирования.


person ChrisW    schedule 24.10.2014    source источник
comment
Предложение Энди, вероятно, лучшее, но пробовали ли вы установить стиль для типа ComboBox (поскольку экземпляр одного помещается в вашу ячейку)? <Style TargetType="ComboBox"> и используйте Setters, чтобы поиграть с выравниванием.   -  person Jerrington    schedule 24.10.2014
comment
Я тоже попробую, но решение Энди, похоже, работает. Результаты выложу позже.   -  person ChrisW    schedule 27.10.2014
comment
Использование сеттеров с targetType, установленным в combobox, похоже, не влияет на комбинированные списки внутри datagrid. Если я не ошибаюсь, я предполагаю, что DataGridComboBoxColumn предоставляет свой собственный стиль.   -  person ChrisW    schedule 27.10.2014


Ответы (1)


Вместо этого вы можете использовать столбец шаблона, я использовал здесь некоторые ненужные данные, но привязки работают в ComboBox точно так же, как и в вашем DataGridComboBoxColumn.

введите описание изображения здесь

<Window x:Class="WpfApplication4.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:sys="clr-namespace:System;assembly=mscorlib"
        Title="MainWindow" Height="350" Width="525">
    <DataGrid>
        <DataGrid.Items>
            <sys:String>a</sys:String>
        </DataGrid.Items>
        <DataGrid.Columns>
            <DataGridTemplateColumn Width="300">
                <DataGridTemplateColumn.CellTemplate>
                    <DataTemplate>
                        <ComboBox HorizontalContentAlignment="Center">
                            <ComboBox.Items>
                                <sys:String>string1</sys:String>
                                <sys:String>string2</sys:String>
                                <sys:String>string3</sys:String>                                
                            </ComboBox.Items>
                        </ComboBox>
                    </DataTemplate>
                </DataGridTemplateColumn.CellTemplate>
            </DataGridTemplateColumn>
        </DataGrid.Columns>
    </DataGrid>
</Window>
person Andy    schedule 24.10.2014