C# MVVM-对视图模型内的属性进行验证

C# MVVM-对视图模型内的属性进行验证,c#,silverlight,xaml,mvvm,C#,Silverlight,Xaml,Mvvm,我试图让自定义验证在视图模型中为我的属性工作,尽管它似乎没有达到验证逻辑中的断点。我正在使用我之前做的另一个验证(我在我的模型中使用了这个验证,它成功了)来尝试输入验证逻辑,这样我就可以根据自己的需要对它进行定制 验证: [Required] [CustomValidation(typeof(CardRangeValidator), "CrossValidateFirstWithLast")] public const string ExpiresOnPropertyN

我试图让自定义验证在视图模型中为我的属性工作,尽管它似乎没有达到验证逻辑中的断点。我正在使用我之前做的另一个验证(我在我的模型中使用了这个验证,它成功了)来尝试输入验证逻辑,这样我就可以根据自己的需要对它进行定制

验证:

    [Required]
    [CustomValidation(typeof(CardRangeValidator), "CrossValidateFirstWithLast")]
    public const string ExpiresOnPropertyName = "ExpiresOn";

    private DateTime? expiresOn = DateTime.Today.AddYears(1);

    /// <summary>
    /// Gets the ExpiresOn property.
    /// TODO Update documentation:
    /// Changes to that property's value raise the PropertyChanged event. 
    /// This property's value is broadcasted by the Messenger's default instance when it changes.
    /// </summary>
    public DateTime? ExpiresOn
    {
        get
        {
            return expiresOn;
        }

        set
        {
            if (expiresOn == value)
            {
                return;
            }

            expiresOn = value;

            RaisePropertyChanged(ExpiresOnPropertyName);
        }
    }
using System.ComponentModel.DataAnnotations;

namespace Fsc.Feenics.Clients.Silverlight2.Web.Models.Shared
{
public class CardRangeValidator
{
    public static ValidationResult CrossValidateFirstWithLast(int number,     ValidationContext context)
    {
        var cardRangeInfo = context.ObjectInstance as CardRangeInfo;
        if (cardRangeInfo == null) return ValidationResult.Success;
        return ValidateFirstLessThanLast(number, cardRangeInfo.Last);
    }

    public static ValidationResult CrossValidateLastWithFirst(int number, ValidationContext context)
    {
        var cardRangeInfo = context.ObjectInstance as CardRangeInfo;
        if (cardRangeInfo == null) return ValidationResult.Success;
        return ValidateFirstLessThanLast(cardRangeInfo.First, number);
    }

    private static ValidationResult ValidateFirstLessThanLast(int firstNumber, int lastNumber)
    {
        return firstNumber <= lastNumber ? ValidationResult.Success : new ValidationResult("First number in range must be less than or equal to last number in range", new string[] { "First", "Last" });
    }
}
}
属性:

    [Required]
    [CustomValidation(typeof(CardRangeValidator), "CrossValidateFirstWithLast")]
    public const string ExpiresOnPropertyName = "ExpiresOn";

    private DateTime? expiresOn = DateTime.Today.AddYears(1);

    /// <summary>
    /// Gets the ExpiresOn property.
    /// TODO Update documentation:
    /// Changes to that property's value raise the PropertyChanged event. 
    /// This property's value is broadcasted by the Messenger's default instance when it changes.
    /// </summary>
    public DateTime? ExpiresOn
    {
        get
        {
            return expiresOn;
        }

        set
        {
            if (expiresOn == value)
            {
                return;
            }

            expiresOn = value;

            RaisePropertyChanged(ExpiresOnPropertyName);
        }
    }
using System.ComponentModel.DataAnnotations;

namespace Fsc.Feenics.Clients.Silverlight2.Web.Models.Shared
{
public class CardRangeValidator
{
    public static ValidationResult CrossValidateFirstWithLast(int number,     ValidationContext context)
    {
        var cardRangeInfo = context.ObjectInstance as CardRangeInfo;
        if (cardRangeInfo == null) return ValidationResult.Success;
        return ValidateFirstLessThanLast(number, cardRangeInfo.Last);
    }

    public static ValidationResult CrossValidateLastWithFirst(int number, ValidationContext context)
    {
        var cardRangeInfo = context.ObjectInstance as CardRangeInfo;
        if (cardRangeInfo == null) return ValidationResult.Success;
        return ValidateFirstLessThanLast(cardRangeInfo.First, number);
    }

    private static ValidationResult ValidateFirstLessThanLast(int firstNumber, int lastNumber)
    {
        return firstNumber <= lastNumber ? ValidationResult.Success : new ValidationResult("First number in range must be less than or equal to last number in range", new string[] { "First", "Last" });
    }
}
}
public const string ExpiresOnPropertyName=“ExpiresOn”;
私人约会时间?expiresOn=DateTime.Today.AddYears(1);
/// 
///获取ExpiresOn属性。
///TODO更新文档:
///更改该属性的值将引发PropertyChanged事件。
///此属性的值在更改时由Messenger的默认实例广播。
/// 
公共约会时间?到期日
{
得到
{
返回到期日;
}
设置
{
if(expiresOn==值)
{
返回;
}
expiresOn=value;
RaisePropertyChanged(ExpiresOnPropertyName);
}
}
验证逻辑:

    [Required]
    [CustomValidation(typeof(CardRangeValidator), "CrossValidateFirstWithLast")]
    public const string ExpiresOnPropertyName = "ExpiresOn";

    private DateTime? expiresOn = DateTime.Today.AddYears(1);

    /// <summary>
    /// Gets the ExpiresOn property.
    /// TODO Update documentation:
    /// Changes to that property's value raise the PropertyChanged event. 
    /// This property's value is broadcasted by the Messenger's default instance when it changes.
    /// </summary>
    public DateTime? ExpiresOn
    {
        get
        {
            return expiresOn;
        }

        set
        {
            if (expiresOn == value)
            {
                return;
            }

            expiresOn = value;

            RaisePropertyChanged(ExpiresOnPropertyName);
        }
    }
using System.ComponentModel.DataAnnotations;

namespace Fsc.Feenics.Clients.Silverlight2.Web.Models.Shared
{
public class CardRangeValidator
{
    public static ValidationResult CrossValidateFirstWithLast(int number,     ValidationContext context)
    {
        var cardRangeInfo = context.ObjectInstance as CardRangeInfo;
        if (cardRangeInfo == null) return ValidationResult.Success;
        return ValidateFirstLessThanLast(number, cardRangeInfo.Last);
    }

    public static ValidationResult CrossValidateLastWithFirst(int number, ValidationContext context)
    {
        var cardRangeInfo = context.ObjectInstance as CardRangeInfo;
        if (cardRangeInfo == null) return ValidationResult.Success;
        return ValidateFirstLessThanLast(cardRangeInfo.First, number);
    }

    private static ValidationResult ValidateFirstLessThanLast(int firstNumber, int lastNumber)
    {
        return firstNumber <= lastNumber ? ValidationResult.Success : new ValidationResult("First number in range must be less than or equal to last number in range", new string[] { "First", "Last" });
    }
}
}
使用System.ComponentModel.DataAnnotations;
命名空间Fsc.Feenics.Clients.Silverlight2.Web.Models.Shared
{
公共类CardRangeValidator
{
公共静态验证结果CrossValidateFirstWithLast(整数,ValidationContext上下文)
{
var cardRangeInfo=context.ObjectInstance作为cardRangeInfo;
if(cardRangeInfo==null)返回ValidationResult.Success;
返回ValidateFirsthanLast(编号,cardRangeInfo.Last);
}
公共静态验证结果CrossValidateLastWithFirst(整数,ValidationContext上下文)
{
var cardRangeInfo=context.ObjectInstance作为cardRangeInfo;
if(cardRangeInfo==null)返回ValidationResult.Success;
返回ValidateFirst(cardRangeInfo.First,编号);
}
私有静态验证结果validateFirstLanst(int firstNumber,int lastNumber)
{

return firstNumber不应该使用ExpiresPropertyChanged(ExpiresOnPropertyName)来代替ExpiresOn?我假设这是用户需要填写的内容。这是真的吗?此属性是否绑定到XAML?请包括。如果您也粘贴xml代码,这将更有帮助。