【问题标题】:Databinding textbox数据绑定文本框
【发布时间】:2011-07-01 03:56:18
【问题描述】:

嗯,我是 MVVM 的新手,所以欢迎任何提示和建议 :)

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

现在出了什么问题:

  • 当用户在文本框中输入并没有退出,而是直接按保存时,该值还没有被数据绑定。那么你如何解决这个问题呢?是使用 coding4fun 库中的 coding4fun:TextBoxBinding.UpdateSourceOnChange="True" 功能的唯一方法吗?

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

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

【问题讨论】:

    标签: data-binding mvvm windows-phone-7


    【解决方案1】:

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

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

    2 - 我没有使用 MVVM Light Toolkit,但大概它具有激活视图模型的概念,您可以在其中将属性重置为视图模型中的默认值。如果不支持,请查看支持此概念的 Caliburn.Micro

    【讨论】:

    • 好吧,我查看了 UpdateSourceTrigger 并做了相反的事情:)。当用户单击 Save 按钮时,我已将其设置为 Explicit 并自己从代码中调用 UpdateSource!感谢您的提示!
    • 与我所说的相反的做法不错:)
    【解决方案2】:

    Re 1:这是一个known issue,如果最后一个具有焦点的控件是一个文本框,并且您单击应用栏按钮,则其最新值未正确绑定数据。在我的 appbar click 事件处理程序中,如果最后一个具有焦点的控件是文本框或密码框,我会调用以下方法来强制进行数据绑定。

    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();
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2011-09-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多