如何在自动生成的wpf DataGridCells中设置绑定选项?

时间:2018-06-15 15:12:56

标签: wpf data-annotations wpfdatagrid idataerrorinfo datagridcell

我在IDataErrorInfo中使用DataAnnotationsViewModels来处理验证,我想在我的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有一个内部TextBoxTextBlock,以及究竟是什么处理了单元格的验证。

有什么想法吗?

1 个答案:

答案 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; }
}