在WPF中,您可以使用ExceptionValidationRule或在数据绑定期间根据数据层中抛出的错误设置验证DataErrorValidationRule.
假设你有一堆这样设置的控件,你有一个Save按钮.当用户单击"保存"按钮时,您需要确保在继续保存之前没有验证错误.如果存在验证错误,您希望对它们大声疾呼.
在WPF中,如何确定是否有任何数据绑定控件设置了验证错误?
我有一个用于编辑数据库信息的WPF窗口,它使用Entity Framework对象表示.当用户关闭窗口时,我想在Closing事件中注意信息是否已更改并显示一个消息框,用于将更改保存到数据库.
不幸的是,在编辑失去焦点之前,对当前焦点编辑的更改不会分配给绑定源,这会在处理Closing事件之后的某个时刻发生.
理想情况下,在检查我的实体是否已被修改之前,会有一个例程提交我可以调用的视图层次结构中的所有更改.我也在寻找有关以焦点方式清除控件焦点的信息,但无法弄清楚如何去做.
我的问题是,这通常是如何处理的?
我有一个TabControl,其中每个Tab及其内容都数据绑定到ObservableCollection:
<TabControl ItemsSource="{Binding Path=.}">
<TabControl.ContentTemplate>
<DataTemplate>
<TextBox Text="{Binding Path=propertyValue}" />
</DataTemplate>
</TabControl>
</TabControl>
Run Code Online (Sandbox Code Playgroud)
如果我单击选项卡1,然后在文本框中键入内容并单击选项卡以使TextBox失去焦点,我键入文本框的新数据将提交给ObservableCollection项.
但是,如果我在TestBox中键入数据然后立即单击另一个选项卡,则永远不会提交数据.另外,当我回到数据时,它不再设置为我输入的内容.
任何人都知道在更改当前选项卡之前强制提交数据的方法吗?
更新和修复
我做了什么是连接SelectionChanged事件:
private void tabData_SelectionChanged(object sender, SelectionChangedEventArgs e) {
theTabControl.Focus();
}
Run Code Online (Sandbox Code Playgroud)
在TabControl上调用Focus()会使TextBox失去焦点并提交数据.我这样做是因为我有其他控件 - 比如DatePicker - 它们表现出类似的行为.这是一个很好的选择.
我注意到UpdateSourceTrigger==LostFocus当用户激活菜单或工具栏时,绑定不会更新.
这导致了一种不幸的情况,即当用户从菜单或工具栏中选择"保存文件"时,用户所做的最后一次更改会丢失.
有没有一个简单的方法或我必须更改我的所有绑定UpdateSourceTrigger=PropertyChanged.
XAML C#不是WEB页面是一个Window
点击一下按钮我:
OnFocusLostFocus控制事件.