【问题标题】:Validation vs focus lost验证与焦点丢失
【发布时间】:2014-10-18 08:21:21
【问题描述】:

我们正在构建一个新应用程序,其中一项要求是“没有保存按钮”。因此,每次更改属性都会被保存。为了减少数据库事务的数量,我们只想在失去焦点后保存 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”属性的设置器。但是验证呢,它应该在每次按键时都起作用,如何实现呢?

【问题讨论】:

  • 归结为您想要 2 个不同的事件。我认为您需要设置一个 Caliburn 消息。

标签: c# wpf mvvm caliburn.micro


【解决方案1】:

您可能想查看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. 
    }

【讨论】:

  • 这总是会迫使我们编写至少两倍于平时的代码。这确实是一个解决方案,但我们希望有更简单的解决方案。
  • 您可以创建一个为您完成所有这些事情的行为。 IE。在控件上订阅 LostFocus,然后调用指定的命令,这样您最终只需要在文本框或类似内容上设置一个附加属性。
猜你喜欢
  • 1970-01-01
  • 2011-11-03
  • 1970-01-01
  • 2011-08-12
  • 2011-04-01
  • 2017-11-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多