Двухстороннее связывание данных Silverlight при Key Up - PullRequest
3 голосов
/ 16 марта 2010

Есть ли способ запустить двустороннее связывание данных, когда в Silverlight происходит событие key up. В настоящее время я должен потерять фокус на текстовом поле, чтобы получить привязку к огню.

<TextBox x:Name="Filter" KeyUp="Filter_KeyUp" Text="{Binding Path=Filter, Mode=TwoWay }"/>

Ответы [ 3 ]

2 голосов
/ 16 марта 2010

Вы также можете использовать интерактивное поведение Blend для создания повторно используемого поведения, которое обновляет привязку для KeyUp, например:

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

        AssociatedObject.KeyUp += AssociatedObject_KeyUp;

    }

    void AssociatedObject_KeyUp(object sender, KeyEventArgs e)
    {
        var bindingExpression = AssociatedObject.GetBindingExpression(TextBox.TextProperty);

        if (bindingExpression != null)
        {
            bindingExpression.UpdateSource();
        }
    }

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

        AssociatedObject.KeyUp -= AssociatedObject_KeyUp;
    }
}
1 голос
/ 16 марта 2010

Я достиг этого, сделав это ...

Filter.GetBindingExpression(TextBox.TextProperty).UpdateSource();

и в XAML

<TextBox x:Name="Filter"  Text="{Binding Path=Filter, Mode=TwoWay, UpdateSourceTrigger=Explicit}" KeyUp="Filter_KeyUp"/>
0 голосов
/ 27 января 2012

У нас было такое же требование к нашему приложению, но некоторые клиенты используют MacO. MacOs не всегда запускает событие keyup (по крайней мере, в Firefox).

В принятом ответе это становится большой проблемой, поскольку UpdateSourceTrigger установлен в Explicit, но событие никогда не запускается Следствие: вы никогда не обновляете привязку.

Однако событие TextChanged всегда запускается. вместо этого послушайте, и все хорошо :) 1005 *

Вот моя версия:

public class AutoUpdateTextBox : TextBox
{
    public AutoUpdateTextBox()
    {
        TextChanged += OnTextChanged;
    }

    private void OnTextChanged(object sender, TextChangedEventArgs e)
    {
        this.UpdateBinding(TextProperty);
    }
}

И метод расширения UpdateBinding:

    public static void UpdateBinding(this FrameworkElement element, 
                                     DependencyProperty dependencyProperty)
    {
        var bindingExpression = element.GetBindingExpression(dependencyProperty);
        if (bindingExpression != null)
            bindingExpression.UpdateSource();
    } 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...