gpt4 book ai didi

mvvm - Windows Phone TextBox 在 TextChanged 上引发命令 RaiseCanExecuteChanged?

转载 作者:行者123 更新时间:2023-12-03 10:14:09 25 4
gpt4 key购买 nike

我有一个文本框和一个绑定(bind)到我的 View 模型中的属性的按钮,如下所示

<TextBox  Text="{Binding UserName, Mode=TwoWay}"  />

<Button Content="Log In" Command="{Binding LoginCommand}"/>

我的用户名属性:
private string userName;
public string UserName
{
get
{
return this.userName;
}
set
{
SetProperty(ref userName, value);
((DelegateCommand)(this.LoginCommand)).RaiseCanExecuteChanged();
}
}

登录命令:
LoginCommand = new DelegateCommand(User_Login, Can_Login);

可以_登录方法:
private bool Can_Login(object arg)
{
if (!string.IsNullOrEmpty(UserName))
return true;
return false;
}

我的问题是登录按钮始终处于启用状态,直到用户名文本框不为空并且 失去焦点 .

我想要做的是在用户立即在 TextBox 中键入一些文本时使按钮变为启用状态,而不会让 TextBox 失去焦点。

有解决方法吗?

最佳答案

尝试玩UpdateSourceTrigger绑定(bind)属性。 TextBox 已将其设置为 LostFocus默认事件,因此 RaiseCanExecuteChanged在这种情况下,在该事件之后被调用。在 WPF 中,我们可以将其设置为 PropertyChanged .使用该设置RaiseCanExecuteChanged将在 text 属性值更改后立即引发,无需等待 LostFocus事件 :

<TextBox Text="{Binding UserName, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />

不幸的是, PropertyChanged不适用于 windows phone 的 silverlight。我们需要使用 Explicit并在 TextChanged 上手动引发绑定(bind) UpdateSource 事件引发的事件:
<TextBox Text="{Binding UserName, Mode=TwoWay, UpdateSourceTrigger=Explicit}" 
TextChanged="OnTextChanged"/>

//in code-behind
private void OnTextChanged(object sender, TextChangedEventArgs e)
{
TextBox textBox = sender as TextBox;
BindingExpression bindingExpr = textBox.GetBindingExpression(TextBox.TextProperty);
//Manually call UpdateSource
bindingExpr.UpdateSource();
}

请注意,这种情况下的代码隐藏很好(来自 MVVM pont-of-view),因为它只是执行一些 UI/绑定(bind)相关的任务,而不是数据相关的任务。

引用 :
  • "UpdateSourceTrigger=PropertyChanged" equivalent for a Windows Phone 7 TextBox
  • Binding.UpdateSourceTrigger Property
  • 关于mvvm - Windows Phone TextBox 在 TextChanged 上引发命令 RaiseCanExecuteChanged?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21879575/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com