为什么DataGridComboBoxColumn CellStyle无法应用填充

时间:2019-09-05 09:08:43

标签: c# wpf .net-4.6.1

有时候,我真的很后悔曾经为应用程序使用WPF ...

我正在尝试使用DataGridComboBoxColumn,我想做的就是在未编辑文本时将填充文本应用于单元格中的文本,但这似乎使这成为不可能的任务

<Window.Resources>
    <CollectionViewSource x:Key="Statuses" Source="{Binding Path=Statuses}" />        
</Window.Resources>

<DataGridComboBoxColumn Header="Status"
                        Width="100"
                        ItemsSource="{Binding Source={StaticResource Statuses}}"
                        DisplayMemberPath="Description"
                        SelectedValuePath="Index"
                        SelectedValueBinding="{Binding Path=Status}">
    <DataGridComboBoxColumn.CellStyle>
        <Style TargetType="{x:Type DataGridCell}">
            <Setter Property="Padding" Value="4,2" />
        </Style>
    </DataGridComboBoxColumn.CellStyle>
</DataGridComboBoxColumn>

我尝试设置ElementStyle并覆盖Template,但这只会导致一些奇怪的验证错误,并且在快速搜索互联网之后,似乎是一个不好的选择。

然后我求助于使用DataGridTemplateColumn,但这使我试图将绑定值转换回与ComboBox DisplayMemberPath相同的文本,并且尝试使用ValueConverter失败,因为它从未通过来自我的CollectionViewSource“状态”的值。

现在我已经没有耐心了,只能接受我无法为这些单元格设置样式,除非在那里有人能够对此进行快速而可靠的修复?

编辑:我创建了一个GitHub Repository,其中包含我要尝试执行的操作的示例,还有一个名为“ value-converter”的分支,但我尝试实现{ {1}},并使用IValueConverter

1 个答案:

答案 0 :(得分:1)

解决此问题的最简单方法可能是定义一个自定义ComboBoxColumn并设置Margin方法中生成的元素的GenerateElement属性:

public class CustomComboBoxColumn : System.Windows.Controls.DataGridComboBoxColumn
{
    protected override FrameworkElement GenerateElement(DataGridCell cell, object dataItem)
    {
        FrameworkElement fe = base.GenerateElement(cell, dataItem);
        if (fe is Control control)
            control.Margin = new Thickness(4, 2, 4, 2);
        return fe;
    }
}

用法:

<local:CustomComboBoxColumn Header="Status"
                                    Width="100"
                                    ItemsSource="{Binding Source={StaticResource Statuses}}"
                                    DisplayMemberPath="Description"
                                    SelectedValuePath="Index"
                                    SelectedValueBinding="{Binding Path=Status}" />