WPF DataGrid

时间:2017-06-22 21:15:36

标签: c# 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中,我将每个Column与其Corresponding 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设置的任何其他验证规则)。 任何帮助都非常感谢!

1 个答案:

答案 0 :(得分:0)

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

$(document).ready(function(){
  var seconds = 0, minutes = 0 , hours = 0;
  setInterval(function(){
    seconds++;
    if(seconds == 60){
      minutes++
      seconds = 0;
    }

    if(minutes == 60){
      hours++
      minutes = 0;
    }
    console.log(hours, minutes, seconds);
    $('#timeTaken').val(`${hours}:${minutes}:${seconds}`);
  }, 1000);

});

可以找到here的详细解释。