嗯,我是MVVM的新手,所以欢迎任何提示和建议:)
我想跟踪用户名和密码,用户可以在“设置”视图中进行设置。 在SettingsViewModel中,我有2个属性用于绑定到视图上文本框的这两个字段。 我在应用栏上添加了一个“保存”按钮,通过RelayCommand,当用户点击它时,它会在ViewModel上执行一个方法。
现在出了什么问题:
当用户键入文本框但未退出时,但直接按下保存时,该值尚未进行数据绑定。那你怎么解决这个问题呢?是使用coding4fun库中的coding4fun:TextBoxBinding.UpdateSourceOnChange =“True”功能的唯一方法吗?
当用户在文本框中输入数据并且是数据绑定时,离开设置页面并返回到它仍将保留此数据。只要用户没有按下保存按钮,我该如何清除它?有点奇怪,你还没有保存页面上的数据...但是因为我使用MVVMLight,页面在ViewModelLocator中静态创建,并且只要程序正在运行就保持“活动”。
就像我说的那样,欢迎任何提示,提示和建议:)
答案 0 :(得分:4)
Re 1:这是known issue,如果最后一个具有焦点的控件是文本框,并且您单击了一个应用栏按钮,则其最新值不能正确显示数据绑定。在我的appbar单击事件处理程序中,如果最后一个具有焦点的控件是文本框或密码框,我会调用以下方法强制数据绑定。
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();
}
}
答案 1 :(得分:3)
1 - 将TextBox
绑定的UpdateSourceTrigger值设置为PropertyChanged
<TextBox Text="{Binding MyProperty, UpdateSourceTrigger=PropertyChanged}" />
2 - 我没有使用过MVVM Light Toolkit,但可能它有一个激活视图模型的概念,你可以在视图模型中将属性重置为默认值。如果没有,那么看看Caliburn.Micro哪个支持这个概念。