2010-03-16 5 views
3

Silverlight에서 키 업 이벤트가 발생하면 양방향 데이터 바인딩을 시작하는 방법이 있습니까? 현재 나는 구속력을 얻기 위해 텍스트 상자에 초점을 잃어야합니다. 나는이 일을함으로써이를 달성Silverlight 양방향 데이터 바인딩 (키 업)

<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

+2

BindingExpression은 SL3에있었습니다. –

+0

이것은 Mac에서는 작동하지 않습니다. 더 나은 해결책이 있습니까? –

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

이 동작은 Xaml이이 동작을 이용하기 위해 어떤 식으로 OP를 포함해야하는지 더 자세히 설명합니다. – AnthonyWJones

0

우리 애플 리케이션에 동일한 요구 사항이 있었지만 일부 클라이언트는 MacOS에 있습니다. MacOS는 항상 Firefox에서 keyup 이벤트를 발생시키는 것은 아닙니다.

허용 된 대답은 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(); 
    } 
관련 문제