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