验证与焦点丢失

时间:2014-08-25 08:08:38

标签: c# wpf mvvm caliburn.micro

我们正在构建一个新的应用程序,其中一个要求是“没有保存按钮”。因此,每次财产变更都会得到保存。为了减少数据库事务的数量,我们只想在焦点丢失后保存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”的设置者。属性仅在文本框失去焦点时。但是关于验证,它应该适用于每个关键的新闻,如何实现这一点?

1 个答案:

答案 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. 
    }