2010-03-16 47 views
3

當Silverlight中的按鍵事件觸發時,是否有辦法觸發雙向數據綁定?目前,我不得不把焦點放在文本框上以獲得綁定的消息。Silverlight上的雙向數據綁定Key up

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

回答

1

我已經這樣做達到這個......

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

,並在XAML

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

哦,你使用SL4。好,因爲BindingExpression在SL3中不存在 – Timores 2010-03-16 13:57:04

+2

BindingExpression在SL3中 – 2010-03-16 14:12:36

+0

這在Mac上不起作用。有更好的解決方案 – 2012-01-27 11:58:20

2

你也可以使用混合交互行爲來創建可重用的行爲更新在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; 
    } 
} 
+2

如果您要包含OPs Xaml應該看起來利用此行爲的優勢,則此答案會更加完整。 – AnthonyWJones 2010-03-16 14:35:10

0

我們對應用程序有相同的要求,但有些客戶使用MacOs。 MacOs並不總是觸發keyup事件(至少在Firefox中)。

在接受的答案中,由於UpdateSourceTrigger設置爲Explicit,所以這成爲一個大問題,但事件從不會觸發。結果:你永遠不會更新綁定。

但是,TextChanged事件始終觸發。聽着這一個來代替,一切都很好:)

這裏是我的版本:

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

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

而且UpdateBinding ExtensionMethod:

public static void UpdateBinding(this FrameworkElement element, 
            DependencyProperty dependencyProperty) 
    { 
     var bindingExpression = element.GetBindingExpression(dependencyProperty); 
     if (bindingExpression != null) 
      bindingExpression.UpdateSource(); 
    }