数据绑定文本框

3

我对MVVM还是有点新手,所以欢迎任何提示和建议 :)

我想跟踪用户名和密码,并且用户可以在设置视图上设置它们。 在SettingsViewModel中,我有两个属性用于这两个字段,这些属性绑定到视图上的文本框。 我在应用栏上添加了一个保存按钮,并通过RelayCommand在用户单击它时执行ViewModel上的方法。

现在出了一些问题:

  • 当用户正在输入文本框并且没有退出它但直接按下保存时,该值尚未进行数据绑定。 那么你如何解决这个问题? 是使用coding4fun库中的coding4fun:TextBoxBinding.UpdateSourceOnChange="True"特性的唯一方法吗?

  • 当用户在文本框中输入数据并且它已经被数据绑定后,离开设置页面并返回它仍将保留此数据。 只要用户没有按保存按钮,我该如何清除它? 当页面没有被保存时保留数据有点奇怪... 但是因为我使用MVVMLight,所以页面在ViewModelLocator中静态创建并在程序运行时保持“活动状态”。

就像我说的,欢迎任何提示,技巧和建议 :)

2个回答

4

问题1: 这是一个已知问题,如果上次获得焦点的控件是文本框,并且您单击应用栏按钮,则其最新值无法正确绑定数据。在我的应用栏单击事件处理程序中,如果上次获得焦点的控件是文本框或密码框,我调用以下方法来强制进行数据绑定。

private static void UpdateBoundText()
{
    var focusObj = FocusManager.GetFocusedElement();
    if (focusObj == null) return;
    var binding = focusObj is TextBox ? ((TextBox)focusObj).GetBindingExpression(TextBox.TextProperty)
                : focusObj is PasswordBox ? ((PasswordBox)focusObj).GetBindingExpression(PasswordBox.PasswordProperty) 
                : null;
    if (binding != null)
    {
        binding.UpdateSource();
    }
}

3

1-将 TextBox 绑定的UpdateSourceTrigger 值设置为 PropertyChanged

<TextBox Text="{Binding MyProperty, UpdateSourceTrigger=PropertyChanged}" />

2 - 我没有使用过MVVM Light Toolkit,但是它可能有一个激活视图模型的概念,在这里您可以重置视图模型中属性的默认值。如果没有这个功能,那么可以看看Caliburn.Micro,它支持这个概念。


我看了一下UpdateSourceTrigger,然后做了相反的事情:)我将其设置为Explicit,并在用户单击Save按钮时自己从代码中调用UpdateSource!感谢您的提示!! - Depechie
不妨采取与我所说相反的策略,这样也不错 :) - devdigital

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接