2011-08-05 61 views
0

我想知道是否可以更改綁定更新綁定到它的控件的時間。例如,我正在使用一個TextBox,它每次按下按鍵時都會更新,但我希望在它失去焦點時進行更新。
任何想法?正在更改Silverlight中可能的綁定時間

+0

你能告訴使用你的一些xaml,我對你如何設法從TextBox中獲得這種行爲很感興趣? – AnthonyWJones

回答

2

好吧,這令我感到驚訝,因爲我認爲TextBox是一個控制它阻止其綁定源的更新,直到焦點移動到其他地方,一個小測試證實了這一點。

無論如何,讓我們想象它通常會在每次按鍵或某個控件上更新,就像它一樣。

一般的解決方案是對源更新進行「手動」控制。您可以使用UpdateSourceTrigger屬性設置將其設置爲「顯式」。這意味着綁定的來源只有在您的代碼明確調用BindingExpression上的UpdateSource方法與「文本框」的TextProperty綁定時纔會更新。

您可以執行此顯式更新,然後在「文本框」LostFocus事件的事件處理程序中執行此操作。

例如,在最初的用戶控件添加此XAML: -

<Grid x:Name="LayoutRoot"> 
    <Grid.RowDefinitions> 
     <RowDefinition Height="Auto" /> 
     <RowDefinition Height="Auto" /> 
     <RowDefinition Height="Auto" /> 
    </Grid.RowDefinitions> 
    <TextBox x:Name="Target" /> 
    <TextBox x:Name="Source" Grid.Row="1" 
     Text="{Binding Text, ElementName=Target, Mode=TwoWay, UpdateSourceTrigger=Explicit}" LostFocus="Source_LostFocus"/> 
</Grid> 

現在在代碼隱藏事件處理程序是這樣的: -

private void Source_LostFocus(object sender, RoutedEventArgs e) 
    { 
     ((TextBox)sender).GetBindingExpression(TextBox.TextProperty).UpdateSource(); 
    } 
+0

+1:好主意。 –

1

不知道這是否是你想要什麼做的,但這裏有一個建議:

刪除綁定,然後爲你的文本框爲引發LostFocus添加事件:即。

private void TextBox_LostFocus(object sender, RoutedEventArgs e) 
{ 
    textBox.Text = originallyBindedValue; 
} 

不像通過XAML那樣乾淨,但你應該能夠得到你想要的行爲。

+0

是的,我想過這樣做,但我希望避免在代碼背後做它。 –

相關問題