背景
在页面上用textbox框显示值,textbox的值改变后,但是不会立即传递到viewmodel中:
下面两种方式实现:
在WPF (Windows Presentation Foundation) 中,如果您希望当用户在TextBox中有焦点时点击页面上的空白区域,使焦点从TextBox移开,您可以通过为包含TextBox的容器(如Grid或Panel)或根窗口添加鼠标事件处理器来实现。以下是一种可能的方法:
为您的容器或窗口添加一个MouseDown事件处理器。
在事件处理器中,检查当前具有焦点的元素是否是TextBox。
如果是,将焦点设置到其他元素上,或者简单地使用Keyboard.ClearFocus();来清除焦点。
xaml
csharp
<Window x:Class="WpfApp.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="MainWindow" Height="350" Width="525"
MouseDown="Window_MouseDown">
<Grid>
<TextBox x:Name="MyTextBox" HorizontalAlignment="Left" Height="23" Margin="10" TextWrapping="Wrap" Text="{Binding MyProperty, Mode=TwoWay, UpdateSourceTrigger=LostFocus}" VerticalAlignment="Top" Width="120"/>
<!-- 其他UI元素 -->
</Grid>
</Window>
C#代码
csharp
private void Window_MouseDown(object sender, MouseButtonEventArgs e)
{
if (FocusManager.GetFocusedElement(this) is TextBox)
{
// 您可以选择将焦点设置到特定元素,或者简单地清除焦点
Keyboard.ClearFocus();
}
}
2.如果上面这种方式没有成功,用第二种
如果您在TextBox中使用Keyboard.ClearFocus()来清除焦点,但发现ViewModel的值没有更新,可能是因为数据绑定的更新机制没有被正确触发。
虽然默认情况下TextBox的UpdateSourceTrigger是LostFocus,但如果您在绑定中明确指定了其他值(如PropertyChanged),则可能会更改更新的行为。如果您想要在每次TextBox值改变时立即更新ViewModel,可以将UpdateSourceTrigger设置为PropertyChanged。
xaml
csharp
<TextBox Text="{Binding MyProperty, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />
将对应的textbox 中的LostFocus 改为PropertyChanged 即可。
csharp
UpdateSourceTrigger=PropertyChanged