0

双向绑定效果很好,但在 TextBox 的情况下,它会在控件失去焦点时发生。

就我而言,我有一个简单的 UI,带有 1 个文本框和提交/取消按钮。

提交按钮在视图上设置为默认值。因此,用户可以在文本框中输入文本并点击“Enter”,这将调用提交的命令。这很好,但我需要从 TextBox 访问值,它不在 VM 中,因为 TextBox 没有失去焦点。如何强制从我的代码更新此 binging?

<TextBox
    Text="{Binding Comment, Mode=TwoWay}"
    Grid.Row="2"/>

<StackPanel
    Grid.Row="3"
    HorizontalAlignment="Right"
    Orientation="Horizontal">
    <Button 
        Padding="20,5"
        Margin="5"
        Command="{Binding CancelCommand}"
        Content="Cancel" IsCancel="True" />
    <Button 
        Padding="20,5"
        Margin="5"
        Command="{Binding SubmitCommand}"
        Content="Submit" IsDefault="True" />
</StackPanel>
4

3 回答 3

2

在 TextBox 绑定上使用 UpdateSourceTrigger=PropertyChanged。

于 2012-08-28T18:45:07.237 回答
1

UpdateSourceTrigger=PropertyChanged 将导致在每次击键时更新源。这是最简单的方法。如果您不想或不需要如此频繁地更新源,您也可以通过执行以下代码强制更新:

        BindingExpression expression = TextBoxDescription.GetBindingExpression(TextBox.TextProperty);
        expression.UpdateSource();
于 2012-08-28T19:01:02.603 回答
0

如果您不想在每次按键后而是在按下提交按钮后更新 VM,您可以在视图上使用 BindingGroup。然后在您的命令处理程序中,您首先调用 BindingGroup.Commit,然后调用 VM 上的提交方法。这不适用于通常的 VM RelayCommand,但您可以创建我称之为粘性命令的东西,以封装此功能。

粘性命令是一个小组件,它通过附加属性附加到 XAML 中的视图,注册命令处理程序,并配置为使用反射调用 VM 上的方法。如果您愿意,可以在http://wpfglue.wordpress.com上阅读它。

于 2012-08-28T19:02:45.770 回答