为什么 DataGridComboBoxColumn CellStyle 不会应用填充

Why DataGridComboBoxColumn CellStyle won't apply padding

有些日子我真的很后悔曾经在应用程序中使用 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 "Statuses".

传递了一个值

现在我 运行 失去了耐心,只能接受我无法为这些单元格设置样式,除非有人对此有快速可靠的修复方法?

编辑:我创建了一个GitHub Repository,其中包含我正在尝试做的示例,还有一个名为'value-converter' 的分支尝试实施 IValueConverter 和使用 DataGridTemplateColumn.

失败

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

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}" />