首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >触发命令时强制绑定更新

触发命令时强制绑定更新
EN

Stack Overflow用户
提问于 2012-06-18 23:00:33
回答 7查看 13.5K关注 0票数 13

有没有一种方法可以在触发命令之前或之后更新绑定?我有一些可以使用命令编辑和保存的文本字段,可以通过键盘快捷键进行访问。由于绑定通常只在文本字段失去焦点时更新,因此在按键保存数据时不会保留最后的更改。相反,我必须先跳出文本字段,使其更新,然后再保存。

有没有办法以一种优雅的方式强制更新?我使用的是MVVM (但不是任何MVVM框架),所以我想在命令代码中去掉UI相关的东西。另外,我并不是真的想要更改绑定以在每次更改时进行更新,只在焦点丢失时才对其进行更新是很好的。

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2012-06-27 22:07:37

我现在已经解决了这个问题,在请求值之前明确地将焦点设置到其他一些元素上。这显然会使当前具有焦点的元素丢失并更新绑定。

为了设置焦点,我写了一个附加的属性,灵感来自于其他问题的答案。另外,我和my other question一起把这个过程自动化了。

因此,为了使用它,我基本上将我的属性附加到一个元素,在本例中是一个选项卡控件:

代码语言:javascript
复制
<TabControl c:Util.ShouldFocus="{Binding ShouldClearFocus}">

在我的视图模型中,我有一个简单的布尔属性ShouldClearFocus,它是一个引发PropertyChangedEvent的标准属性,因此数据绑定可以工作。然后,当我想要重置焦点时,我只需将ShouldClearFocus设置为true。附加的属性会自动设置焦点并再次重置属性值。这样,我就可以继续设置ShouldClearFocus,而不必在两者之间将其设置为false

attached属性是一个标准实现,其更改处理程序为:

代码语言:javascript
复制
public static void ShouldFocusChanged(DependencyObject obj, DependencyPropertyChangedEventArgs e)
{
    if (!(bool)e.NewValue || !(obj is FrameworkElement))
        return;

    FrameworkElement element = (FrameworkElement)obj;
    if (element.Focusable)
        element.Focus();

    // reset value
    BindingExpression bindingExpression = BindingOperations.GetBindingExpression(obj, ShouldFocusProperty);
    if (bindingExpression != null)
    {
        PropertyInfo property = bindingExpression.DataItem.GetType().GetProperty(bindingExpression.ParentBinding.Path.Path);
        if (property != null)
            property.SetValue(bindingExpression.DataItem, false, null);
    }
    else
        SetShouldFocus(obj, false);
}
票数 2
EN

Stack Overflow用户

发布于 2012-07-12 10:26:10

如果当前元素是一个TextBox,那么您也可以只更新绑定源,而不是改变焦点。你可以对其他控件做类似的事情,但根据我的经验,我只在TextBox上遇到过这个问题。

代码语言:javascript
复制
  // if the current focused element is textbox then updates the source.     
    var focusedElement = Keyboard.FocusedElement as FrameworkElement;
    
    if (focusedElement is TextBox)
    {
       var expression = focusedElement.GetBindingExpression(TextBox.TextProperty);
        if (expression != null) expression.UpdateSource();
    }
票数 11
EN

Stack Overflow用户

发布于 2016-01-16 03:53:42

在您的TextBox上,您需要在文本绑定上设置UpdateSourceTrigger,它定义了何时使用TextBox值更新源。默认情况下,对于Text属性,它是LostFocus,这正是正在发生的事情-它只在失去焦点时更新源代码。您应该将UpdateSourceTrigger的值设置为PropertyChanged,它将在每次textbox的值更改时更新。

例如:

代码语言:javascript
复制
<TextBox ... Text="{Binding Foo, UpdateSourceTrigger=PropertyChanged}"/>

Path是使用绑定命令时的缺省属性,因此上面的值等于Path=Foo

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11085542

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档