我们正在构建一个新的应用程序,其中一个要求是“没有保存按钮”。因此,每次财产变更都会得到保存。为了减少数据库事务的数量,我们只想在焦点丢失后保存TextBox文本。
我们的问题是验证, 我们通常使用这样的东西:
[Required(AllowEmptyStrings = false, ErrorMessage = "Email is required")]
[EmailAddress(ErrorMessage = "This is not valid email address")]
public string UserEmail
{
get { return userEmail; }
[DebuggerNonUserCode]
set
{
Validator.ValidateProperty(value, new ValidationContext(this, null, null)
{ MemberName = "UserEmail" }
);
userEmail = value;
NotifyOfPropertyChange(() => UserEmail);
}
}
这仅适用于
binding.UpdateSourceTrigger = UpdateSourceTrigger.PropertyChanged;
但是在新的解决方案中 - 我们想要输入“UserEmail”的设置者。属性仅在文本框失去焦点时。但是关于验证,它应该适用于每个关键的新闻,如何实现这一点?
答案 0 :(得分:0)
您可能需要查看System.Windows.Interactivity.WPF库,其中包含一个作为附加行为的“交互”类。 它允许您基本上订阅您需要订阅的任何事件。这将允许您通过绑定对“属性已更改”进行验证,就像您现在一样,然后在输入字段失去焦点时执行实际的DB调用。 对于文本框,这可能类似于:
<TextBox Text="{Binding TextField, UpdateSourceTrigger=PropertyChanged}">
<i:Interaction.Triggers>
<i:EventTrigger EventName="LostFocus">
<i:EventTrigger.Actions>
<i:InvokeCommandAction Command="{Binding SaveCommand}"/>
</i:EventTrigger.Actions>
</i:EventTrigger>
</i:Interaction.Triggers>
</TextBox>
所以基本上你要从属性的实际“设置者”中“解除”你的保存电话。也许是这样的事情:
private string textField;
public string TextField
{
get { return textField; }
set
{
if (value == textField) return;
textField = value;
OnPropertyChanged();
}
}
private ICommand saveCommand;
public ICommand SaveCommand
{
get { return saveCommand ?? (saveCommand = new DelegateCommand(Save)); }
}
private void Save()
{
// Do your DB transactions here.
}