我在IDataErrorInfo
中使用DataAnnotations
和ViewModels
来处理验证,我想在我的DataGrid
中使用它们进行验证。我可以在TextBox
:
<TextBox Name="TestBox"
Text="{Binding TextProperty, UpdateSourceTrigger=PropertyChanged,
ValidatesOnDataErrors=True, NotifyOnValidationError=True}"/>
但是,在我的DataGrid
中,列会自动生成,如果手动定义,我无法设置ValidatesOnDataErrors
绑定选项。
我想要做的是样式中的这些内容,因为我不想改变Binding的值,只有它的绑定选项:
<Style TargetType="DataGridCell">
<Setter Property="Content" Value="{Binding Path=., UpdateSourceTrigger=PropertyChanged,
ValidatesOnDataErrors=True, NotifyOnValidationError=True}"/>
</Style>
但这不起作用。我不确定要在setter中使用哪个Property,因为DataGridCell
有一个内部TextBox
或TextBlock
,以及究竟是什么处理了单元格的验证。
有什么想法吗?
答案 0 :(得分:1)
在您的数据网格上,挂钩“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; }
}