是否可以在Silverlight中更改绑定时间

时间:2011-08-05 20:40:14

标签: silverlight

我想知道是否可以更改绑定更新绑定到它的控件的时间。例如,我正在使用TextBox,每次按下一个键都会更新,但我希望它在失去焦点时更新。
有什么想法吗?

2 个答案:

答案 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那样干净,但你应该能够得到你想要的行为。