双向绑定工作非常好,但是在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>
答案 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上阅读。