5

我有一个验证数据 OnTabSelectionChanged 的​​ Silverlight 2 应用程序。我立即开始希望 UpdateSourceTrigger 允许的不仅仅是 LostFocus,因为如果您单击选项卡而不关闭控件,则 LINQ 对象在验证之前不会更新。

我通过将焦点设置到另一个控件然后返回 OnTextChanged 来解决 TextBoxes 的问题:

Private Sub OnTextChanged(ByVal sender As Object, ByVal e As TextChangedEventArgs)
    txtSetFocus.Focus()
    sender.Focus()
End Sub

现在我正在尝试在 DataGrid 中完成相同类型的 hack。我的 DataGrid 使用在运行时为 CellTemplate 和 CellEditingTemplate 生成的 DataTemplate。我尝试将 TextChanged="OnTextChanged" 写入 DataTemplate 中的 TextBox,但它没有被触发。

有人有想法么?

4

4 回答 4

7

您也可以使用应用于文本框的行为来做到这一点

// xmlns:int is System.Windows.Interactivity from System.Windows.Interactivity.DLL)
// xmlns:behavior is your namespace for the class below
<TextBox Text="{Binding Description,Mode=TwoWay,UpdateSourceTrigger=Explicit}">
    <int:Interaction.Behaviors>
       <behavior:TextBoxUpdatesTextBindingOnPropertyChanged />
    </int:Interaction.Behaviors>
</TextBox>


public class TextBoxUpdatesTextBindingOnPropertyChanged : Behavior<TextBox>
{
    protected override void OnAttached()
    {
        base.OnAttached();

        AssociatedObject.TextChanged += new TextChangedEventHandler(TextBox_TextChanged);
    }

    protected override void OnDetaching()
    {
        base.OnDetaching();

        AssociatedObject.TextChanged -= TextBox_TextChanged;
    }

    void TextBox_TextChanged(object sender, TextChangedEventArgs e)
    {
        var bindingExpression = AssociatedObject.GetBindingExpression(TextBox.TextProperty);
        bindingExpression.UpdateSource();
    }
}
于 2010-07-14T23:22:11.067 回答
0

这篇博文展示了如何使用附加属性显式更新文本框的源: http ://www.thomasclaudiushuber.com/blog/2009/07/17/here-it-is-the-updatesourcetrigger-for-propertychanged-in -银光/

您可以轻松修改它以与其他控件一起使用......

于 2010-05-25T20:24:00.060 回答
0

我在使用 MVVM 和 Silverlight 4 时遇到了同样的问题。问题是在文本框失去焦点之前绑定不会更新源,但是将焦点设置在另一个控件上并不能解决问题。

我找到了一个结合使用两篇不同博客文章的解决方案。我使用了 Patrick Cauldwell 的 DefaultButtonHub 概念中的代码,以及来自 SmallWorkarounds.net 的一个“SmallWorkaround”

http://www.cauldwell.net/patrick/blog/DefaultButtonSemanticsInSilverlightRevisited.aspx

www.smallworkarounds.net/2010/02/elementbindingbinding-modes.html

我的更改导致 DefaultButtonHub 类的以下代码:

public class DefaultButtonHub
{
    ButtonAutomationPeer peer = null;

    private void Attach(DependencyObject source)
    {
        if (source is Button)
        {
            peer = new ButtonAutomationPeer(source as Button);
        }
        else if (source is TextBox)
        {
            TextBox tb = source as TextBox;
            tb.KeyUp += OnKeyUp;
        }
        else if (source is PasswordBox)
        {
            PasswordBox pb = source as PasswordBox;
            pb.KeyUp += OnKeyUp;
        }
    }

    private void OnKeyUp(object sender, KeyEventArgs arg)
    {
        if (arg.Key == Key.Enter)
            if (peer != null)
            {
                if (sender is TextBox)
                {
                    TextBox t = (TextBox)sender;
                    BindingExpression expression = t.GetBindingExpression(TextBox.TextProperty);
                    expression.UpdateSource();
                }
                ((IInvokeProvider)peer).Invoke();
            }
    }

    public static DefaultButtonHub GetDefaultHub(DependencyObject obj)
    {
        return (DefaultButtonHub)obj.GetValue(DefaultHubProperty);
    }

    public static void SetDefaultHub(DependencyObject obj, DefaultButtonHub value)
    {
        obj.SetValue(DefaultHubProperty, value);
    }

    // Using a DependencyProperty as the backing store for DefaultHub.  This enables animation, styling, binding, etc...
    public static readonly DependencyProperty DefaultHubProperty =
        DependencyProperty.RegisterAttached("DefaultHub", typeof(DefaultButtonHub), typeof(DefaultButtonHub), new PropertyMetadata(OnHubAttach));

    private static void OnHubAttach(DependencyObject source, DependencyPropertyChangedEventArgs prop)
    {
        DefaultButtonHub hub = prop.NewValue as DefaultButtonHub;
        hub.Attach(source);
    }

}

这应该包含在 Silverlight 的某种文档中:)

于 2010-06-19T23:00:19.303 回答
-2

我知道这是旧消息......但我通过这样做解决了这个问题:

Text="{绑定路径=newQuantity, UpdateSourceTrigger=PropertyChanged}"

于 2009-10-31T17:11:28.117 回答