我的 WPF 应用程序中有一个 DataGrid。 我想知道是否有一种方法可以显示数据网格中列的默认值。 例如,我让用户能够向 DataGrid 添加新行。 因此,在 DataGrid 的底部,始终有一个空白行供用户添加数据。 我希望这一行中的列有一个默认值。 有什么办法可以实现这个功能吗? 谢谢!
假设您的
ItemsSource
中的 DataGrid
是 SomeClass
的集合,并且您在 DataGrid 列中显示 Properties
中的不同 SomeClass
。您可以做的是在默认 SomeClass
的构造函数中为 Properties
分配一些默认值。通过这种方式,您可以在 DataGrid 中拥有默认列值。
编辑
正如你所说,列的
itemssource
是一个字符串,我能想到一种方法..
使其成为
SomeClass
的集合,它将仅具有 string
属性。在 SomeClass
的默认构造函数中,为该字符串指定一个默认值。该默认值将出现在您的数据网格列中
在 DataGrind 上创建一个 CheckBox 列并将其绑定到“myBoolColumn”
<DataGridCheckBoxColumn Header="Selected" Binding="{Binding myBoolColumn}" />
DataTable data = new DataTable();
data.Columns.Add("myBoolColumn", typeof(System.Boolean));
data.Columns["myBoolColumn"].DefaultValue = false;
实际上你可以在
ValueConverters
的帮助下做到这一点。当 CanUserAddRows=Tru
e 时,行的 DataContext
绑定到 ItemsSource
的元素或绑定到空白行的 {DataGrid.NewItemPlaceholder}
。
<DataGrid ItemsSource="{Binding Path=Collection}" CanUserAddRows=True >
<DataGrid.Columns>
<DataGridTemplateColumn>
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<TextBlock
Text="{Binding Converter={StaticResource ShowSuitablePart}}"/>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
</DataGridTemplateColumn>
</DataGrid.Columns>
</DataGrid>
这是
ShowSuitablePart
转换器的代码。
public class ShowSuitablePart : IValueConverter
{
public object Convert(object value, Type targetType,
object parameter, CultureInfo culture)
{
if (value.ToString() == "{DataGrid.NewItemPlaceholder}")
return "This is blank row, just click me to create a new one";
else
((YourCollectionObject)value).SomeProperty;
}
public object ConvertBack(object value, Type targetType,
object parameter, CultureInfo culture)
{
throw new Exception();
}
}
如果您需要
TwoWay
绑定,则必须在 DataTemplate
中使用 2 个元素。第一个用于空白行,第二个用于带有 TwoWay
装订的常规行。设置可见性绑定以隐藏常规行的第一个元素和空白行的第二个元素。
请记住,如果您确定集合对象的某些属性的路径,则在空白行情况下它不会引发
ValueConverter
。
如果您绑定到 DataGridColumn 值,则可以使用 FallBackValue 显示如下所示的默认值(或者可以使用转换器):
<DataGridTextColumn Header="SomeHeader" Binding="{Binding SomeDataGridItem, FallbackValue=0}">
如果您正在访问 ItemSource 集合的属性,这也应该有效:
<DataGridTextColumn Header="SomeHeader" Binding="{Binding SomeDataGridItem.SomeProperty, FallbackValue=0}">