如何在自动生成的 wpf DataGridCells 中设置绑定选项?
How to set binding options in wpf DataGridCells that are auto generated?
我在我的 ViewModels
中使用 IDataErrorInfo
和 DataAnnotations
来进行验证,我想在我的 DataGrid
中使用它们进行验证。我想要的细胞行为可以在 TextBox
:
中轻松模拟
<TextBox Name="TestBox"
Text="{Binding TextProperty, UpdateSourceTrigger=PropertyChanged,
ValidatesOnDataErrors=True, NotifyOnValidationError=True}"/>
但是,在我的 DataGrid
中,列是自动生成的,我无法像手动定义它们那样设置 ValidatesOnDataErrors
绑定选项。
我想做的是按照样式中的这些行做的事情,因为我不想改变绑定的值,只想改变它的绑定选项:
<Style TargetType="DataGridCell">
<Setter Property="Content" Value="{Binding Path=., UpdateSourceTrigger=PropertyChanged,
ValidatesOnDataErrors=True, NotifyOnValidationError=True}"/>
</Style>
但这不起作用。我不确定在 setter 中使用什么 属性,因为 DataGridCell
有一个内部 TextBox
或 TextBlock
,以及究竟是什么处理了单元格的验证。
有什么想法吗?
在您的数据网格上,挂钩 "AutoGeneratingColumn" 事件。
在事件处理程序中,您可以使用 e.Column 获取绑定并进行调整。不过,您必须先将 e.Column 转换为正确的类型(例如 DataGridTextColumn)。
<DataGrid AutoGenerateColumns="True" Name="dg" AutoGeneratingColumn="dg_AutoGeneratingColumn" />
代码:
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
dg.ItemsSource = new List<MyItem>() { new MyItem() { Item1 = "Item 1", Item2 = "Item 2" } };
}
private void dg_AutoGeneratingColumn(object sender, DataGridAutoGeneratingColumnEventArgs e)
{
var tc = e.Column as System.Windows.Controls.DataGridTextColumn;
var b = tc.Binding as System.Windows.Data.Binding;
b.UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged;
b.ValidatesOnDataErrors = true;
b.NotifyOnValidationError = true;
}
}
public class MyItem
{
public string Item1 { get; set; }
public string Item2 { get; set; }
}
我在我的 ViewModels
中使用 IDataErrorInfo
和 DataAnnotations
来进行验证,我想在我的 DataGrid
中使用它们进行验证。我想要的细胞行为可以在 TextBox
:
<TextBox Name="TestBox"
Text="{Binding TextProperty, UpdateSourceTrigger=PropertyChanged,
ValidatesOnDataErrors=True, NotifyOnValidationError=True}"/>
但是,在我的 DataGrid
中,列是自动生成的,我无法像手动定义它们那样设置 ValidatesOnDataErrors
绑定选项。
我想做的是按照样式中的这些行做的事情,因为我不想改变绑定的值,只想改变它的绑定选项:
<Style TargetType="DataGridCell">
<Setter Property="Content" Value="{Binding Path=., UpdateSourceTrigger=PropertyChanged,
ValidatesOnDataErrors=True, NotifyOnValidationError=True}"/>
</Style>
但这不起作用。我不确定在 setter 中使用什么 属性,因为 DataGridCell
有一个内部 TextBox
或 TextBlock
,以及究竟是什么处理了单元格的验证。
有什么想法吗?
在您的数据网格上,挂钩 "AutoGeneratingColumn" 事件。
在事件处理程序中,您可以使用 e.Column 获取绑定并进行调整。不过,您必须先将 e.Column 转换为正确的类型(例如 DataGridTextColumn)。
<DataGrid AutoGenerateColumns="True" Name="dg" AutoGeneratingColumn="dg_AutoGeneratingColumn" />
代码:
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
dg.ItemsSource = new List<MyItem>() { new MyItem() { Item1 = "Item 1", Item2 = "Item 2" } };
}
private void dg_AutoGeneratingColumn(object sender, DataGridAutoGeneratingColumnEventArgs e)
{
var tc = e.Column as System.Windows.Controls.DataGridTextColumn;
var b = tc.Binding as System.Windows.Data.Binding;
b.UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged;
b.ValidatesOnDataErrors = true;
b.NotifyOnValidationError = true;
}
}
public class MyItem
{
public string Item1 { get; set; }
public string Item2 { get; set; }
}