當Silverlight中的按鍵事件觸發時,是否有辦法觸發雙向數據綁定?目前,我不得不把焦點放在文本框上以獲得綁定的消息。Silverlight上的雙向數據綁定Key up
<TextBox x:Name="Filter" KeyUp="Filter_KeyUp" Text="{Binding Path=Filter, Mode=TwoWay }"/>
當Silverlight中的按鍵事件觸發時,是否有辦法觸發雙向數據綁定?目前,我不得不把焦點放在文本框上以獲得綁定的消息。Silverlight上的雙向數據綁定Key up
<TextBox x:Name="Filter" KeyUp="Filter_KeyUp" Text="{Binding Path=Filter, Mode=TwoWay }"/>
我已經這樣做達到這個......
Filter.GetBindingExpression(TextBox.TextProperty).UpdateSource();
,並在XAML
<TextBox x:Name="Filter" Text="{Binding Path=Filter, Mode=TwoWay, UpdateSourceTrigger=Explicit}" KeyUp="Filter_KeyUp"/>
你也可以使用混合交互行爲來創建可重用的行爲更新在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;
}
}
如果您要包含OPs Xaml應該看起來利用此行爲的優勢,則此答案會更加完整。 – AnthonyWJones 2010-03-16 14:35:10
我們對應用程序有相同的要求,但有些客戶使用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();
}
哦,你使用SL4。好,因爲BindingExpression在SL3中不存在 – Timores 2010-03-16 13:57:04
BindingExpression在SL3中 – 2010-03-16 14:12:36
這在Mac上不起作用。有更好的解決方案 – 2012-01-27 11:58:20