以编程方式强制从V到VM的TextBox值?

时间:2012-08-28 18:42:15

标签: .net wpf xaml data-binding mvvm

双向绑定工作非常好,但是在TextBox的情况下,它会在控件失去焦点时发生。

在我的情况下,我有简单的UI,包含1个TextBox和Submit / Cancel按钮。

在视图上提交设置为默认的按钮。因此,用户可以在文本框中键入文本并点击“Enter”,这将调用Submit的命令。这很好,但我需要从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>

3 个答案:

答案 0 :(得分:2)

在TextBox绑定上使用UpdateSourceTrigger = PropertyChanged。

答案 1 :(得分:1)

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

        BindingExpression expression = TextBoxDescription.GetBindingExpression(TextBox.TextProperty);
        expression.UpdateSource();

答案 2 :(得分:0)

如果要在每次按键后都不更新VM,但在按下Submit-Button后,可以在View上使用BindingGroup。然后在您的Command处理程序中,首先调用BindingGroup.Commit,然后在VM上调用submit方法。这与通常的VM RelayCommand不兼容,但你可以创建我称之为Sticky Command的东西,以便封装这个功能。

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