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代码,这将更有帮助。