【问题标题】:How to set binding options in wpf DataGridCells that are auto generated?如何在自动生成的 wpf DataGridCells 中设置绑定选项?
【发布时间】:2018-06-15 15:12:56
【问题描述】:

我在我的ViewModels 中使用IDataErrorInfoDataAnnotations 来处理验证,我想在我的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>

但这不起作用。我不确定在设置器中使用什么属性,因为DataGridCell 有一个内部TextBoxTextBlock,以及究竟是什么处理单元格的验证。

有什么想法吗?

【问题讨论】:

    标签: wpf data-annotations wpfdatagrid idataerrorinfo datagridcell


    【解决方案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; }
    }
    

    【讨论】:

    • 我试过你的解决方案,但似乎没有效果。请注意,默认情况下,数据网格会在无法转换的输入上进行验证(当您在需要 int 的字段中输入字符串时会显示错误)。但它不适用于 [Range(0,255)] 等 DataAnnotations 的验证
    猜你喜欢
    • 2011-07-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-25
    • 2011-06-07
    • 2019-04-02
    • 1970-01-01
    相关资源
    最近更新 更多