有时候,我真的很后悔曾经为应用程序使用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
。
答案 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}" />