繁体   English   中英

WPF DataGrid中特定行的条目的验证规则

[英]Validation rules for entries of a particular row in a WPF DataGrid

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

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

我设置“列验证规则”的方式为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; }
}

对于我的DataGrid MyDgr的2行,我创建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.RowValidationRules>
  <local:CourseValidationRule ValidationStep="UpdatedValue"/>
</DataGrid.RowValidationRules>

可以在这里找到有关它的详细说明。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM