我想知道是否可以更改绑定更新绑定到它的控件的时间。例如,我正在使用TextBox,每次按下一个键都会更新,但我希望它在失去焦点时更新。
有什么想法吗?
答案 0 :(得分:2)
这让我感到惊讶,因为我认为TextBox是一个控制器,它阻止了对绑定源的更新,直到焦点转移到别处,一个小测试证实了这一点。
无论如何,让我们想象它通常会在每次按键或某些控件上更新。
一般的解决方案是对源更新进行“手动”控制。您可以使用UpdateSourceTrigger
属性设置为“明确”来执行此操作。这意味着只有当您的代码在UpdateSource
上显式调用BindingExpression
方法以便与“TextBox”的TextProperty
进行绑定时,才会更新绑定源。
您可以在“TextBox”LostFocus
事件的事件处理程序中执行此显式更新。
例如,在最初的UserControl中添加此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();
}
答案 1 :(得分:1)
不确定这是否正是您要做的,但这是一个建议:
删除绑定,然后为LostFocus的文本框添加一个事件:ie。
private void TextBox_LostFocus(object sender, RoutedEventArgs e)
{
textBox.Text = originallyBindedValue;
}
不像XAML那样干净,但你应该能够得到你想要的行为。