双向绑定工作得很好,但在TextBox中,当控件失去焦点时就会发生这种情况。
在我的例子中,我有一个简单的UI,有一个TextBox和Submit/Cancel按钮。
在视图上设置为默认的提交按钮。因此,用户可以在文本框中键入文本并点击"Enter“,这将调用Submit命令。这很好,但是我需要从TextBox访问值,它不在VM中,因为TextBox没有松散焦点。如何强制此绑定从我的代码更新?
<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>
发布于 2012-08-29 02:45:07
在TextBox绑定上使用UpdateSourceTrigger=PropertyChanged。
发布于 2012-08-29 03:01:03
UpdateSourceTrigger=PropertyChanged将使源代码在每次击键时都被更新。这是最简单的方法。如果您不想或不需要如此频繁地更新源代码,也可以通过执行以下代码来强制更新:
BindingExpression expression = TextBoxDescription.GetBindingExpression(TextBox.TextProperty);
expression.UpdateSource();
发布于 2012-08-29 03:02:46
如果您不想在每次按键后更新VM,而是在按下Submit-Button之后更新VM,则可以在视图上使用BindingGroup。然后在命令处理程序中,首先调用BindingGroup.Commit,然后在VM上调用submit方法。这不能很好地与通常的VM RelayCommand一起工作,但您可以创建我称之为粘滞命令的东西,以便封装此功能。
粘滞命令是一个小组件,它通过附加的属性附加到XAML中的视图,注册命令处理程序,并配置为使用反射调用VM上的方法。如果你愿意,你可以在http://wpfglue.wordpress.com上阅读它。
https://stackoverflow.com/questions/12165471
复制相似问题