当前位置:  开发笔记 > Android > 正文

保存之前的WPF Databind

如何解决《保存之前的WPFDatabind》经验,为你挑选了4个好方法。

在我的WPF应用程序中,我有许多数据绑定TextBoxes.在UpdateSourceTrigger这些绑定的LostFocus.使用"文件"菜单保存对象.我遇到的问题是可以在TextBox中输入一个新值,从File菜单中选择Save,并且永远不会保留新值(TextBox中可见的值)因为访问菜单不会从TextBox中删除焦点.我怎样才能解决这个问题?有没有办法强制页面中的所有控件数据绑定?

@palehorse:好点.不幸的是,我需要使用LostFocus作为我的UpdateSourceTrigger,以支持我想要的验证类型.

@dmo:我想到了这一点.然而,对于一个相对简单的问题,它似乎是一个非常不优雅的解决方案.此外,它要求页面上有一些控件,它始终可见以接收焦点.然而,我的应用程序是标签,因此没有这样的控件容易出现.

@Nidonocu:使用菜单没有从TextBox移动焦点的事实也使我感到困惑.然而,这就是我所看到的行为.以下简单示例演示了我的问题:


    
        
    
    
        
            
                
            
        
        
            
    

using System;
using System.Text;
using System.Windows;
using System.Windows.Data;

namespace WpfApplication2
{
    public partial class Window1 : Window
    {
        public MyItem Item
        {
            get { return (FindResource("MyItemProvider") as ObjectDataProvider).ObjectInstance as MyItem; }
            set { (FindResource("MyItemProvider") as ObjectDataProvider).ObjectInstance = value; }
        }

        public Window1()
        {
            InitializeComponent();
            Item = new MyItem();
        }

        private void MenuItem_Click(object sender, RoutedEventArgs e)
        {
            MessageBox.Show(string.Format("At the time of saving, the values in the TextBoxes are:\n'{0}'\nand\n'{1}'", Item.ValueA, Item.ValueB));
        }
    }

    public class MyItem
    {
        public string ValueA { get; set; }
        public string ValueB { get; set; }
    }
}

BigBlondeVik.. 23

我发现从菜单的FocusScope中删除范围所依赖的菜单项会导致文本框正确失去焦点.我不认为这适用于Menu中的所有项目,但肯定适用于保存或验证操作.


对我来说,这似乎是最好的解决方案.谢谢. (2认同)

+1我目前正在通过类似的问题来确保这个答案存在,因为它是最好的! (2认同)

这将把焦点放在工具栏按钮上. (2认同)


小智.. 15

假设选项卡序列中有多个控件,以下解决方案似乎是完整且通用的(只是剪切和粘贴)...

Control currentControl = System.Windows.Input.Keyboard.FocusedElement as Control;

if (currentControl != null)
{
    // Force focus away from the current control to update its binding source.
    currentControl.MoveFocus(new TraversalRequest(FocusNavigationDirection.Next));
    currentControl.Focus();
}


rudigrobler.. 7

这是一个UGLY黑客,但也应该工作

TextBox focusedTextBox = Keyboard.FocusedElement as TextBox;
if (focusedTextBox != null)
{
    focusedTextBox.GetBindingExpression(TextBox.TextProperty).UpdateSource();
}

此代码检查TextBox是否具有焦点...如果找到1 ...更新绑定源!



1> BigBlondeVik..:

我发现从菜单的FocusScope中删除范围所依赖的菜单项会导致文本框正确失去焦点.我不认为这适用于Menu中的所有项目,但肯定适用于保存或验证操作.



对我来说,这似乎是最好的解决方案.谢谢.
+1我目前正在通过类似的问题来确保这个答案存在,因为它是最好的!
这将把焦点放在工具栏按钮上.

2> 小智..:

假设选项卡序列中有多个控件,以下解决方案似乎是完整且通用的(只是剪切和粘贴)...

Control currentControl = System.Windows.Input.Keyboard.FocusedElement as Control;

if (currentControl != null)
{
    // Force focus away from the current control to update its binding source.
    currentControl.MoveFocus(new TraversalRequest(FocusNavigationDirection.Next));
    currentControl.Focus();
}



3> rudigrobler..:

这是一个UGLY黑客,但也应该工作

TextBox focusedTextBox = Keyboard.FocusedElement as TextBox;
if (focusedTextBox != null)
{
    focusedTextBox.GetBindingExpression(TextBox.TextProperty).UpdateSource();
}

此代码检查TextBox是否具有焦点...如果找到1 ...更新绑定源!


+1,这就是我现在正在使用的解决方法.为了使它不那么难看,我建议在调用`UpdateSource`之前检查`null`的绑定表达式(因为未绑定的TextBox当前可能具有焦点).

4> rudigrobler..:

假设您在窗口中有一个TextBox,并且其中有一个带有Save按钮的ToolBar.假设TextBox的Text属性绑定到业务对象上的属性,并且绑定的UpdateSourceTrigger属性设置为LostFocus的默认值,这意味着当TextBox失去输入焦点时,绑定值将被推回到业务对象属性.另外,假设ToolBar的Save按钮的Command属性设置为ApplicationCommands.Save命令.

在这种情况下,如果您编辑TextBox并用鼠标单击"保存"按钮,则会出现问题.单击工具栏中的按钮时,TextBox不会失去焦点.由于TextBox的LostFocus事件不会触发,因此Text属性绑定不会更新业务对象的source属性.

显然,如果UI中最近编辑的值尚未推送到对象中,则不应验证和保存对象.这是Karl解决的确切问题,通过在他的窗口中编写代码来手动查找具有焦点的TextBox并更新数据绑定的源.他的解决方案运行良好,但它让我想到了一个通用的解决方案,在这个特定场景之外也是有用的.输入CommandGroup ...

摘自Josh Smith关于CommandGroup的CodeProject文章


此解决方案仅适用于TextBox.有没有办法使它适用于任何控制?
推荐阅读
LEEstarmmmmm
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有