在Silverlight 4中验证组合框

时间:2011-10-31 10:15:26

标签: silverlight validation mvvm

当我的ItemsSource绑定到复杂类型的ObserableCollection时,我试图了解验证如何适用于组合框。我使用RIA作为连接客户端层到中间层的服务。也不确定这是否会对组合框控件在数据形式中产生影响。我已经对此做了很多阅读,发现这篇文章最有用:http://www.run80.net/?p=93

首先,我的实体:我有一个像这样装饰的领域:

[Required]
public virtual long FrequencyId { get; set; }

[Include]
[Association("TreatmentFrequencyToTreatmentRecordAssociation", "FrequencyId", "Id", IsForeignKey = true)]
public virtual TreatmentFrequency Frequency
{
    get
    {
        return this.frequency;
    }

    set
    {
        this.frequency = value;

        if (value != null)
        {
            this.FrequencyId = value.Id;
        }
    }
}

现在我相信我不能在关联上设置[Required]注释,而是在外键id上设置(上面的文章说的内容)。

实际治疗频率类如下所示:

public class TreatmentFrequency
{
    [Key]
    public virtual long Id { get; set; }

    [Required]
    [StringLength(10)]
    public virtual string Code { get; set; }

    [Required]
    [StringLength(40)]
    public virtual string Name { get; set; }

    public override bool Equals(object obj)
    {
        obj = obj as TreatmentFrequency;
        if (obj == null)
        {
            return false;
        }

        return this.Id == ((TreatmentFrequency)obj).Id;
    }

    public override int GetHashCode()
    {
        return this.Name.GetHashCode();
    }
}

我已经覆盖了Equals和GetHashCode方法,因为在另一篇文章中它说,当你在一个集合中时,你需要覆盖equals以匹配键,否则当你使用SelectedItem时,尽管所有的值都是相同的集合和selecteditem它们将是两个不同的实例,因此与Equals的默认实现不匹配。

现在我的xaml看起来像这样:

<df:DataField Label="Frequency">
    <ComboBox SelectedItem="{Binding Path=CurrentItem.Frequency, Mode=TwoWay}" ItemsSource="{Binding Path=Frequencies}" DisplayMemberPath="Name" SelectedValue="{Binding Path=CurrentItem.FrequencyId, Mode=TwoWay}" SelectedValuePath="Id"/>
</df:DataField>

老实说,上面对我没有多大意义,我可以删除SelectedValue和SelectedValuePath,表单仍然可以正常工作(没有验证)我认为Selected Value会指向复杂类型E.g. CurrentItem.Frequency然后是SelectedValuePath将是底层的“Name”属性。但是我也理解作者试图做的是[Required]标签不在关联上,而是外键id E.g. CurrentItem.FrequencyId,所以它必须要去某个地方。

现在最后的竞争对手是这个表单是向导的一部分,因此我无法验证整个对象,而是我手动必须验证某些字段,这些字段仅在此特定向导步骤中填充。为此,我创建了方法:

public void ValidateProperty(object value, string propertyName)
{
    var results = new List<ValidationResult>();

    Validator.TryValidateProperty(value, new ValidationContext(this.TreatmentRecord, null, null) { MemberName = propertyName }, results);

    foreach (var error in results)
    {
        this.TreatmentRecord.ValidationErrors.Add(error);
    }
}

在我的视图模型中,我有一个方法IsValid,在允许向导导航到下一步之前调用它,然后我调用上面的方法:

public bool IsValid
{
    get
    {
        this.treatmentRecordWizardContext.ValidateProperty(this.treatmentRecordWizardContext.TreatmentRecord.Frequency, "Frequency");
        this.treatmentRecordWizardContext.ValidateProperty(this.treatmentRecordWizardContext.TreatmentRecord.FrequencyId, "FrequencyId");

        this.OnPropertyChanged(() => this.CurrentItem);

        if (this.treatmentRecordWizardContext.TreatmentRecord.ValidationErrors.Count == 0)
        {
            return true;
        }

        return false;
    }
}

使用上述所有代码时,当组合框保持为空时,将完全忽略验证。我还没有模仿组合框本身,所以我真的不知道为什么它不起作用,并且解决方案的哪个部分真的有问题,是绑定还是RIA中的实体没有正确定义!

希望有人可以帮助我花了很长时间试图让它工作,我认为这必须由其他开发人员进行,所以我希望这是一个简单的修复。

1 个答案:

答案 0 :(得分:0)

这实际上是一个简单的问题,我假设[Required]注释会检查关联是否存在而不是null。似乎所有它实际上都检查在这种情况下FrequencyId不为null。还有一个问题是我使用的是长而不是可以长的(长?)。一旦我进行了更改以使它们可以为空,验证就开始按预期工作,即使对我来说没有任何意义的绑定也是如此。如果有人能解释他们会很棒!

菲尔