【问题标题】:Setter not called after TextBox loses focus在 TextBox 失去焦点后未调用 Setter
【发布时间】:2014-11-23 21:19:53
【问题描述】:

这是我的问题,当应用程序启动时,用户选择文本框。无需输入任何内容,用户单击选项卡即可选择下一个文本框。这应该为第一个文本框绑定触发 viewmodel 中的 setter 方法。但这似乎没有发生。

在视图模型中:

private string _username;
public string Username
{
    get { return _username; }
    set
    {
        _username = value;
        RaisePropertyChanged("Username");
        Validator.Validate(() => Username);
    }
} 

在 xaml 中:

<TextBox Text="{Binding Username, Mode=TwoWay, ValidatesOnDataErrors=True}" />

当我开始输入内容时,会调用用户名设置方法,然后将其删除并将焦点移至其他内容。 Datacontext 已正确设置并正常工作。

1) 用户将焦点设置到用户名文本框,不输入任何内容

2) 用户将焦点移至表单上的下一项

结果 = 当用户名文本框失去焦点时,视图模型中的 Setter 方法不会被调用

我需要的结果 = 即使用户没有输入任何内容,也会调用 Setter 方法

【问题讨论】:

  • “这应该触发 setter 方法”——请准确解释为什么您认为这是真的。如果TextBox 的内容没有改变,为什么要调用视图模型的setter?如果您想知道控件何时失去焦点,为什么不直接处理LostFocus 事件呢?当值实际上没有改变时,为什么要进行属性更改通知和数据验证?我觉得这个问题很混乱。
  • 当用户没有在文本框中输入任何内容而只是移动到下一个控件时,我需要能够显示验证错误。但是如果没有调用 setter,那么我无法验证该字段是否为空。
  • 查看Binding类的UpdateSourceTrigger属性
  • @Maxwe11,文本框的默认值为 LostFocus,这就是我想要的。所以我不需要重新设置。
  • @PeterDuniho,是的,我可以在后面的代码中处理 LostFocus 事件。但是当表单上有很多文本框时,我必须为所有文本框都这样做......

标签: c# wpf xaml mvvm


【解决方案1】:

如果目的是立即触发验证状态(这是我从您的“无论如何都需要调用设置器”中得到的),那么为什么不在Window 级别使用Loaded 事件并分配@ 987654323@这样就不管验证码触发了吗?

或者更好的是,使用IDataErrorInfo,它在getter 调用期间执行验证,这意味着第一次加载TextBox 时,将调用IDataErrorInfo 接口并验证属性。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多