【问题标题】:data is not bound when enter key is pressed按下回车键时数据未绑定
【发布时间】:2011-08-10 05:23:43
【问题描述】:

我正在使用 Silverlight 和 MVVM 模式。

<TextBox Name="UserNameText" Text="{Binding Path=Username, Mode=TwoWay}" HorizontalContentAlignment="Stretch"/>

在此我已将 TextBox 绑定到属性用户名,当按下 Enter 键时,我正在视图模型中执行 LoginCommand。

private void LayoutRoot_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.Key == Key.Enter)
            {
                this._viewModel.LoginCommand.Execute(null);
            }
        }

当在 TextBox 中输入用户名并从 UserName TextBox 按下 ENTER 键时,会调用 LoginCommand,但不会在属性 Username 中更新值。它仍然包含 null。

如果只有焦点丢失,这些值是绑定的。如何解决这个问题?

【问题讨论】:

    标签: data-binding silverlight-4.0 mvvm


    【解决方案1】:

    在绑定中更改UpdateSourceTrigger=PropertyChanged。默认情况下,TextBox 只更新它在LostFocus 上的绑定值。将其设置为 PropertyChanged 将使其在属性更改时更新绑定值。

    <TextBox Name="UserNameText" 
             Text="{Binding Path=Username, UpdateSourceTrigger=PropertyChanged}" />
    

    【讨论】:

    • 对不起。它在 Silverlight 中不起作用。您建议的任何内容都适用于 WPF,但不适用于 SL。
    • @Jai 以下是某人创建 AttachedProperty 以在 Silverlight 中实现此行为的示例:marlongrech.wordpress.com/2010/12/27/…
    【解决方案2】:

    你无法解决这个问题,这就是绑定的工作方式(它会在焦点丢失时更新,你是对的)。 但是,解决方案非常简单:您可以将文本框的文本作为命令的参数发送:

    this._viewModel.LoginCommand.Execute(((TextBox)sender).Text);
    

    【讨论】:

    • 哎呀。我需要将用户名和密码都传递给 LoginCommand。该怎么做?
    • 好吧,您可以创建将它们组合在一个字符串中,例如“login|password”,然后在命令执行委托中解析)或者您可以创建一个额外的实体类,例如 public class UserCreds { string Login {get; set;} string 传递 {get;set;} } 并将它的实例传递给命令。要从密码文本框中检索文本,您应该在 xaml 中为该文本框分配一个 x:Name 属性,并通过代码隐藏中的 this.nameOfPassTextbox.Text 获取它
    猜你喜欢
    • 2010-11-13
    • 2018-06-23
    • 2015-08-22
    • 2019-12-23
    • 2014-05-12
    • 1970-01-01
    • 2021-02-27
    • 2013-05-25
    • 1970-01-01
    相关资源
    最近更新 更多