我有文本框。其updatesourcetrigger属性设置为lostfocus。我不想把它设置为比例变化。
现在假设,我的WPF表单已经很脏,用户正在更新文本框。现在,当焦点仅在文本框中时,用户直接按CTRL + S键(即它调用SAVE命令)。
当调用save命令时,现在更新的文本框值不反映在viewmodel中(即我的视图和视图模型数据未同步。)
我可以在命令调用之前以某种方式将数据从视图提取到viewmodel,还是可以在调用命令之前调用textbox lostfocus事件。
提前致谢....
答案 0 :(得分:0)
直接在TextBox上绑定键/手势并失去焦点。然后让手势遍历Window以进行保存。 :)
答案 1 :(得分:0)
您需要在TextBox的BindingExpression上调用UpdateSource,但您的viewModel无权访问TextBox。所以你需要在viewModel中使用一个事件来完成它。
在您的视图中写下此代码:
myViewModel.UpdateTextSource += () =>
{
BindingExpression be = textBox1.GetBindingExpression(MainWindow.TextProperty);
be.UpdateSource();
};
在命令中触发此事件。
if(UpdateTextSource != null)
UpdateTextSource();
如果您需要更新不同的文本框,则可以向事件添加参数:
if(UpdateTextSource != null)
UpdateTextSource(TextProperty.Name);
在视图中,将具有此功能的所有文本框的标记设置为属性的名称。
<TextBox Text="{Binding PhoneNO}" Tag="PhoneNO"/>
然后获取参数以查找与参数值具有相同标记的文本框。
myViewModel.UpdateTextSource += t =>
{
var tb = GetTextBoxWithTag(t);//implement this function
BindingExpression be = tb.GetBindingExpression(MainWindow.TextProperty);
be.UpdateSource();
};
答案 2 :(得分:0)
您可以在相关PreviewKeyDown
上使用System.Windows.IInputElement
处理程序。在您的情况下,这将是实现CTRL + S的Wpf控件。
在处理程序中,检查CTRL+S
按键,如果是,请将您的UIData“拉”到视图模型中。
答案 3 :(得分:0)
感谢大家的宝贵意见。
我已经使用MoveFocus方法解决了这个问题。
在我看来,在执行命令之前我已经调用了函数:
private void MoveFocus()
{
var focusElement = KeyBoard.FocusElement as UIElement;
if(focusElement != null)
{
focusElement.MoveFocus(FocusNavigationDirection.Next);
}
}
所以在我的命令执行之前,文本框将失去焦点,输入的文本框值将反映在viewmodel ..... :)中:)
答案 4 :(得分:0)
我在https://stackoverflow.com/a/47309346/4554937回答了类似的问题。我编写了更新聚焦键盘元素的绑定源的命令,并在保存数据之前执行它。
我的CommitValueCommand
public void Execute(object parameter)
{
if (Keyboard.FocusedElement is TextBox textBox)
{
BindingOperations.GetBindingExpression(textBox, TextBox.TextProperty).UpdateSource();
}
}