【问题标题】:Validation rules for entries of a particular row in a WPF DataGridWPF DataGrid 中特定行条目的验证规则
【发布时间】:2017-06-22 21:15:36
【问题描述】:

我有一个包含 2 列(Column1 和 Column2)和 2 行的 DataGrid (MyDgr)。我可以按列为我的 DataGrid 设置验证规则。 例如:对于 Column1,所有条目必须是正数,对于 Column2,所有条目必须是

但是,我还希望能够为每一行设置不同的验证规则。 例如,第一行的条目只能是整数,而第二行的条目可以是双精度数。

我设置“列验证规则”的方式,我为 2 列创建了 2 个类

public class Column1ValidationRule : ValidationRule
{

    public override ValidationResult Validate(object value, System.Globalization.CultureInfo cultureInfo)
    {
        if (value != null)
        {
            double proposedValue;
            if (!double.TryParse(value.ToString(), out proposedValue))
            {
                return new ValidationResult(false, "'" + value.ToString() + "' is not a real number.");
            }

            if (proposedValue <= 0)
            {
                return new ValidationResult(false, "value must be positive.");
            }
        }

        return new ValidationResult(true, null);
    }
}

public class Column2ValidationRule : ValidationRule
{

    public override ValidationResult Validate(object value, System.Globalization.CultureInfo cultureInfo)
    {
        if (value != null)
        {
            double proposedValue;
            if (!double.TryParse(value.ToString(), out proposedValue))
            {
                return new ValidationResult(false, "'" + value.ToString() + "' is not a real number.");
            }

            if (proposedValue >= 5)
            {
                return new ValidationResult(false, "value must be less than 5.");
            }
        }

        return new ValidationResult(true, null);
    }
}

在 XAML 中,我将每个列与其对应的 ValidationRule 绑定。这部分工作得很好。

<DataGrid x:Name="MyDgr" ItemsSource="{Binding}" AutoGenerateColumns="False" CanUserAddRows="False" >
<DataGrid.Columns>
    <DataGridTextColumn Header="Column1">
        <DataGridTextColumn.Binding>
            <Binding Path="Col1" NotifyOnTargetUpdated="True" UpdateSourceTrigger="PropertyChanged" Mode="TwoWay">
                <Binding.ValidationRules>
                    <data:Column1ValidationRule />
                </Binding.ValidationRules>
            </Binding>
        </DataGridTextColumn.Binding>
    </DataGridTextColumn>
    <DataGridTextColumn Header="Column2">
        <DataGridTextColumn.Binding>
            <Binding Path="Col2" NotifyOnTargetUpdated="True" UpdateSourceTrigger="PropertyChanged" Mode="TwoWay">
                <Binding.ValidationRules>
                    <data:Column2ValidationRule />
                </Binding.ValidationRules>
            </Binding>
        </DataGridTextColumn.Binding>
    </DataGridTextColumn>                                
</DataGrid.Columns>

对于DataGrid DataContext,我创建了一个类:

   public class Mydata
{
    public string Col1 { get; set; }
    public string Col2 { get; set; }
}

对于我的 2 行 DataGrid MyDgr,我创建了 2 个 Mydata 对象的新实例,我将它们添加到可观察集合中:

var row1 = new Mydata();
var row2 = new Mydata();

ObservableCollection<MyData> dataColl = new ObservableCollection<MyData>();
dataColl.Add(row1);
dataColl.Add(row2);

myDgr.DataContext = dataColl;

但是,我不知道如何使我的 DataGrid 中的两行具有那些额外的不同验证规则(第一行中的条目只能是整数,而第二行中的条目可以是双打,或者我想由 Row 设置的任何其他验证规则)。 非常感谢任何帮助!

【问题讨论】:

    标签: c# wpf datagrid


    【解决方案1】:

    您可以实现如下所示的行级验证:

    <DataGrid.RowValidationRules>
      <local:CourseValidationRule ValidationStep="UpdatedValue"/>
    </DataGrid.RowValidationRules>
    

    详细解释见here。

    【讨论】:

    • 感谢您的回答@Naresh。我可以看到“CourseValidationRule”如何适用于所有行。但是我怎样才能对不同的行使用不同的验证规则呢?例如,假设我希望第一行遵循 ValidationRuleA,第二行遵循 ValidationRuleB。
    • 一种解决方法是在 CourseValidationRule 逻辑中编写 if else 或 switch case。
    • 谢谢,我会试试的。
    猜你喜欢
    • 1970-01-01
    • 2016-09-23
    • 2014-02-04
    • 2012-12-09
    • 2011-05-20
    • 2017-03-27
    • 1970-01-01
    • 2023-03-25
    • 1970-01-01
    相关资源
    最近更新 更多