Hai all, 我正在使用MVVM模型做一个项目,任何人都可以通过说我如何在这个模型中验证我的字段来帮助我。验证意味着,如果用户没有添加名称(示例)的文本字段,那么消息想要使用弹出窗口或其他任何东西显示。我们通过编写一个函数来执行此操作,此函数将在保存之前调用,或者在此时如果任何Mandetory字段空闲,则会显示错误,填写那个领域只有我们可以继续。我怎么能在MVVM模型中做到这一点?
答案 0 :(得分:0)
好的,我不是百分百肯定你要去哪里,但我会举个例子。不知道这对MVVM有什么用处,但我想应该这样做。
在你的模型中添加:
public bool IsValid
{
get
{
return (GetRuleViolations().Count() == 0);
}
}
public override IEnumerable<RuleViolation> GetRuleViolations()
{
if (string.IsNullOrEmpty(Name))
yield return new RuleViolation("Name can't be empty", "Name");
else if (Name.Length >= 30)
yield return new RuleViolation("Name can't be more then 30 letters", "Name");
if (!string.IsNullOrEmpty(Address))
{
if (!Web.Contains("http"))
yield return new RuleViolation("Address must be bla bal", "Address");
}
// and so on
yield break;
}
创建RuleViolation类:
public class RuleViolation
{
public string ErrorMessage { get; private set; }
public string PropertyName { get; private set; }
public RuleViolation(string errorMessage, string propertyName)
{
ErrorMessage = errorMessage;
PropertyName = propertyName;
}
}
现在,当您调用IsValid方法时,它将检查每个属性。如果您使用的是INotifyPropertyChanged,我会在每次更新任何经过验证的属性时添加IsValid作为属性进行更新。如果你有一个基础模型类,你可以在那里添加它并在每个派生类中定义规则:
public bool IsValid
{
get
{
return (GetRuleViolations().Count() == 0);
}
}
public abstract IEnumerable<RuleViolation> GetRuleViolations();
现在的问题是如何在UI中显示此错误。那取决于用户界面是什么。我们假设WPF应用程序。然后你需要你的模型来继承IDataErrorInfo,你可以像这样使用它:
#region IDataErrorInfo Members
public string Error
{
get { return null; }
}
public string this[string name]
{
get
{
string result = null;
if (this.GetRuleViolations().Where(v => v.PropertyName == name).Count() > 0)
{
result = this.GetRuleViolations().Where(v => v.PropertyName == name).First().ErrorMessage;
}
return result;
}
}
然后在XAML代码中:
<TextBox Style="{StaticResource ValidationTextBox}" >
<TextBox.Text>
<Binding Path="Name" UpdateSourceTrigger="PropertyChanged">
<Binding.ValidationRules>
<DataErrorValidationRule />
</Binding.ValidationRules>
</Binding>
</TextBox.Text>
</TextBox>
<Style x:Key="ValidationTextBox" TargetType="TextBox" >
<Setter Property="Validation.ErrorTemplate">
<Setter.Value>
<ControlTemplate>
<Border BorderBrush="Red" BorderThickness="1">
<AdornedElementPlaceholder />
</Border>
</ControlTemplate>
</Setter.Value>
</Setter>
<Style.Triggers>
<Trigger Property="Validation.HasError" Value="true">
<Setter Property="ToolTip"
Value="{Binding RelativeSource={RelativeSource Self},
Path=(Validation.Errors)[0].ErrorContent}"/>
</Trigger>
</Style.Triggers>
</Style>
如果您使用Asp.net作为UI,那么还有一些内置方法可以在表单中显示错误。
我可以成为可能并且可能有更好的方法,但我希望这有所帮助。