- Java锁的逻辑(结合对象头和ObjectMonitor)
- 还在用饼状图?来瞧瞧这些炫酷的百分比可视化新图形(附代码实现)⛵
- 自动注册实体类到EntityFrameworkCore上下文,并适配ABP及ABPVNext
- 基于Sklearn机器学习代码实战
WPF入门教程系列五——Window 介绍 。
DataGrid 控件可以在单元格级别和行级别执行验证。 通过单元格级别验证,可以在用户修改单元的数据时验证绑定数据对象的单个属性。 通过行级别验证,可以在用户提交对行的更改时验证整行对象的数据。 还可以提供针对验证错误的自定义可视化反馈,或使用 DataGrid 控件提供的默认可视化反馈.
今天通过下面的示例学习如何将验证规则应用于 DataGrid 绑定并自定义可视化错误信息提示.
1. 在Visual Studio 2022的“解决方案资源管理器”中,使用鼠标右键单击“WpfGridDemo.NET7”项目,在弹出菜单中选择“添加-->新建文件夹”。 并将“新文件夹”改名为 “Vali”.
2. 在Visual Studio 2022的解决方案资源管理器中,使用鼠标右键单击“Vali”文件夹,在弹出菜单中选择“添加--> 类”,在弹出的“添加新项”对话框中,选择添加 “AreaValidationRule”类,这是一个我们要实现的验证类,然后选择“添加”.
3.要实现在自定交验证规则,则必须继承ValidationRule类,并重写Validate方法,下面就是具体实现代码:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Controls; using System.Windows.Data; using System.Windows.Input; using WpfGridDemo.NET7.Entitys; namespace WpfGridDemo.NET7.Vali { public class AreaValidationRule: ValidationRule { public override ValidationResult Validate( object value, System.Globalization.CultureInfo cultureInfo) { Area course = (value as BindingGroup).Items[ 0 ] as Area; if (course.Created > course.Updated) { return new ValidationResult( false , " 创建日期必须小于等于更新日期。 " ); } else { return ValidationResult.ValidResult; } } } }
。
< DataGrid.Resources > < Style x:Key ="errorStyle" TargetType =" {x:Type TextBox} " > < Setter Property ="Padding" Value ="-2" /> < Style.Triggers > < Trigger Property ="Validation.HasError" Value ="True" > < Setter Property ="Background" Value ="Red" /> < Setter Property ="ToolTip" Value =" {Binding RelativeSource={RelativeSource Self}, Path=(Validation.Errors)[0].ErrorContent} " /> </ Trigger > </ Style.Triggers > </ Style > </ DataGrid.Resources >
。
5. 对DataGrid的DataGridTextColumn 绑定错误提示信息样式,设置ValidatesOnExceptions属性为true,此属性提供了显式使用元素的 ExceptionValidationRule替代方法。 ExceptionValidationRule是一个内置验证规则,用于检查在更新源属性期间引发的异常.
。
< DataGridTextColumn Header ="ID" Width ="100" EditingElementStyle =" {StaticResource errorStyle} "
Binding =" {Binding Id ,ValidatesOnExceptions=True} " ClipboardContentBinding =" {x:Null} " />
6.在Visual Studio 2022中按F5键,启动WPF应用程序。然后使用鼠标点击省份下拉框,界面中DataGrid中的呈现了城市与县区镇数据.
请尝试以下操作:
你会发现,删除或是填了非整数值的那个单元格变成了红色,鼠标移到到其他单元格,也无法进入编辑模式。如下图.
。
7. 移动鼠标,将光标置入到红色的单元格中,然后按 ESC 键,应用程序自动撤消了无效的单元格值。如下图.
。
。
。
8.在Visual Studio 2022中打开MainWindows.xmal文件,并在文件的开头添加如下命名空间。 。
xmlns:vl="clr-namespace:WpfGridDemo.NET7.Vali"
9. 将之前创建的验证规则AreaValidationRule添加到 DataGrid.RowValidationRules 集合中。 以便通过 RowValidationRules 属性直接访问 BindingGroup 实例的 ValidationRules 属性,该实例对控件使用的所有绑定进行分组。 。
< DataGrid.RowValidationRules > < vl:AreaValidationRule ValidationStep ="UpdatedValue" /> </ DataGrid.RowValidationRules >
10. 通过设置 DataGrid.RowValidationErrorTemplate 属性,自定义各个 DataGrid 控件的行验证时的错误提示。 还可以使用隐式行样式设置 DataGridRow.ValidationErrorTemplate 属性来影响多个控件.
当用户输入无效值,行标题中将显示带有白色感叹号的红色圆圈。 行和单元格验证错误时都将发生这种情况。 关联的错误消息将显示在工具提示中。 。
< DataGrid.RowValidationErrorTemplate > < ControlTemplate > < Grid Margin ="0,-2,0,-2" ToolTip =" {Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type DataGridRow}}, Path=(Validation.Errors)[0].ErrorContent} " > < Ellipse StrokeThickness ="0" Fill ="Red" Width =" {TemplateBinding FontSize} " Height =" {TemplateBinding FontSize} " /> < TextBlock Text ="!" FontSize =" {TemplateBinding FontSize} " FontWeight ="Bold" Foreground ="White" HorizontalAlignment ="Center" /> </ Grid > </ ControlTemplate > </ DataGrid.RowValidationErrorTemplate >
11. 对DataGrid的DataGridTextColumn 绑定错误提示信息样式,设置ValidatesOnExceptions属性为true,此属性提供了显式使用元素的 ExceptionValidationRule替代方法。 ExceptionValidationRule是一个内置验证规则,用于检查在更新源属性期间引发的异常.
< DataGridTextColumn Header ="创建时间" Width ="160" EditingElementStyle =" {StaticResource errorStyle} "
Binding =" {Binding Created ,ValidatesOnExceptions=True,StringFormat=s} " ClipboardContentBinding =" {x:Null} " /> < DataGridTextColumn Header ="更新时间" Width ="160" EditingElementStyle =" {StaticResource errorStyle} "
Binding =" {Binding Updated,ValidatesOnExceptions=True,StringFormat=s} " ClipboardContentBinding =" {x:Null} " />
12. 在Visual Studio 2022中按F5键,启动WPF应用程序。然后使用鼠标点击省份下拉框,界面中DataGrid中的呈现了城市与县区镇数据.
请尝试以下操作:
你会发现,删除了日期的那个单元格变成了红色,鼠标移到到其他单元格,也无法进入编辑模式.
你会发现,在行的行头中将显示一个红色感叹号 (!),将鼠标指针移到行标题中的标记上,以查看关联的错误消息.
如下图.
。
。
。
13.MainWindow.xmal的全部代码如下:
< Window x:Class ="WpfGridDemo.NET7.MainWindow" xmlns ="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x ="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:d ="http://schemas.microsoft.com/expression/blend/2008" xmlns:be ="http://schemas.microsoft.com/xaml/behaviors" xmlns:mc ="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:local ="clr-namespace:WpfGridDemo.NET7" xmlns:v ="clr-namespace:WpfGridDemo.NET7.ViewModel" xmlns:vl ="clr-namespace:WpfGridDemo.NET7.Vali" mc:Ignorable ="d" Title ="MainWindow" Height ="600" Width ="960" Loaded ="Window_Loaded" > < Grid > < Grid.RowDefinitions > < RowDefinition Height ="100" ></ RowDefinition > < RowDefinition Height ="*" ></ RowDefinition > < RowDefinition Height ="25" ></ RowDefinition > </ Grid.RowDefinitions > < WrapPanel Grid.Row ="0" HorizontalAlignment ="Left" > < ComboBox x:Name ="cboProvince" DisplayMemberPath ="Name" SelectedValuePath ="Code" > < be:Interaction.Triggers > < be:EventTrigger EventName ="SelectionChanged" > < be:InvokeCommandAction Command =" {Binding ProviceChangedAction} "
CommandParameter =" {Binding ElementName=cboProvince} " /> </ be:EventTrigger > </ be:Interaction.Triggers > </ ComboBox > </ WrapPanel > < DataGrid x:Name ="gridArea" Grid.Row ="1" ItemsSource =" {Binding GridAreaList} "
AutoGenerateColumns ="False" HorizontalAlignment ="Left" VerticalAlignment ="Top" SelectedItem =" {Binding Path=AreaVM, Mode=TwoWay,UpdateSourceTrigger=PropertyChanged} " > < DataGrid.Resources > < Style x:Key ="errorStyle" TargetType =" {x:Type TextBox} " > < Setter Property ="Padding" Value ="-2" /> < Style.Triggers > < Trigger Property ="Validation.HasError" Value ="True" > < Setter Property ="Background" Value ="Red" /> < Setter Property ="ToolTip" Value =" {Binding RelativeSource={RelativeSource Self}, Path=(Validation.Errors)[0].ErrorContent} " /> </ Trigger > </ Style.Triggers > </ Style > </ DataGrid.Resources > < DataGrid.Columns > < DataGridComboBoxColumn Header ="城市" Width ="120" x:Name ="cboCity"
ItemsSource =" {x:Static v:MainWindowVM.GridCityList} " ClipboardContentBinding =" {x:Null} " SelectedValuePath ="Code" SelectedValueBinding =" {Binding Path=CityCode,
UpdateSourceTrigger=PropertyChanged} " DisplayMemberPath ="Name" SelectedItemBinding =" {x:Null} " /> < DataGridComboBoxColumn Header ="城市(Style)" SelectedValuePath ="Code"
SelectedValueBinding =" {Binding Path=CityCode,UpdateSourceTrigger=PropertyChanged} "
DisplayMemberPath ="Name" SelectedItemBinding =" {x:Null} " Width ="1*" > < DataGridComboBoxColumn.EditingElementStyle > < Style TargetType ="ComboBox" > < Setter Property ="ItemsSource" Value =" {Binding Path=DataContext.GridCity,ElementName=gridArea} " /> </ Style > </ DataGridComboBoxColumn.EditingElementStyle > < DataGridComboBoxColumn.ElementStyle > < Style TargetType ="ComboBox" > < Setter Property ="ItemsSource" Value =" {Binding Path=DataContext.GridCity,ElementName=gridArea} " /> </ Style > </ DataGridComboBoxColumn.ElementStyle > </ DataGridComboBoxColumn > < DataGridTextColumn Header ="县区镇" Width ="*" Binding =" {Binding Name} " ClipboardContentBinding =" {x:Null} " /> < DataGridTextColumn Header ="邮编" Width ="100" Binding =" {Binding Code} " ClipboardContentBinding =" {x:Null} " /> < DataGridTextColumn Header ="ID" Width ="100" EditingElementStyle =" {StaticResource errorStyle} "
Binding =" {Binding Id ,ValidatesOnExceptions=True} " ClipboardContentBinding =" {x:Null} " /> < DataGridTextColumn Header ="创建时间" Width ="160" EditingElementStyle =" {StaticResource errorStyle} "
Binding =" {Binding Created ,ValidatesOnExceptions=True,StringFormat=s} " ClipboardContentBinding =" {x:Null} " /> < DataGridTextColumn Header ="更新时间" Width ="160" EditingElementStyle =" {StaticResource errorStyle} "
Binding =" {Binding Updated,ValidatesOnExceptions=True,StringFormat=s} " ClipboardContentBinding =" {x:Null} " /> </ DataGrid.Columns > < DataGrid.RowValidationRules > < vl:AreaValidationRule ValidationStep ="UpdatedValue" /> </ DataGrid.RowValidationRules > < DataGrid.RowValidationErrorTemplate > < ControlTemplate > < Grid Margin ="0,-2,0,-2" ToolTip =" {Binding RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type DataGridRow}}, Path=(Validation.Errors)[0].ErrorContent} " > < Ellipse StrokeThickness ="0" Fill ="Red" Width =" {TemplateBinding FontSize} " Height =" {TemplateBinding FontSize} " /> < TextBlock Text ="!" FontSize =" {TemplateBinding FontSize} " FontWeight ="Bold" Foreground ="White" HorizontalAlignment ="Center" /> </ Grid > </ ControlTemplate > </ DataGrid.RowValidationErrorTemplate > </ DataGrid > < WrapPanel Grid.Row ="2" > < Button x:Name ="btnRefresh" Height ="22" Width ="120" Click ="btnRefresh_Click" > 刷新 </ Button > < Button x:Name ="btnSave" Height ="22" Width ="120" Command =" {Binding ClickSaveAction} " > 保存 </ Button > </ WrapPanel > </ Grid > </ Window >
。
。
。
。
。
。
。
最后此篇关于WPF入门教程系列三十——DataGrid验证的文章就讲到这里了,如果你想了解更多关于WPF入门教程系列三十——DataGrid验证的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
有没有办法在另一个 WPF 窗口内托管 WPF 窗口。我有几个有点复杂的表格。但现在为了简化事情,我试图将其中一些合并为一个“仪表板”表单中的标签页。 请注意,我不是要托管 Windows 窗体,而是
WPF 特有的哪些方面和实践在非 WPF GUI 编程中最有用(并且并非难以实现)? 最佳答案 通过学习 WPF 命令,我了解了命令模式。它构成了 UI - 代码分离的基础,我认为应该在其他应用程序中
WinRT/Metro 正在获得一个新的 SemanticZoom控制,但我很难为 WPF 找到任何东西。 我不想为我的特定项目切换到 Metro,因为它不允许我制作窗口应用程序或跨多个显示器的多个实
我很难解决我的问题,我快要疯了。 想法是这样的:我有两个 ListView 元素,当一个元素从第一个列表掉落到第二个列表时,我需要打开一个对话,但我需要被掉落的元素的信息以及被添加以填充对话的元素。
如果我遵循TabControl,并且一切正常,当我切换到第二个Tabitem时,它显示就没有问题。 //datagrid //datagrid2 但是如果我有这个xaml,当我
在 Windows 窗体应用程序中,我们的数据 GridView 有很多事件,如行鼠标双击或行单击以及额外的...... 但是在 WPF 中我找不到这些事件。我如何将行鼠标双击添加到其中包含数据网格的
在这个项目中,代码 正确编译和执行 ;但是,我需要帮助解决两个问题: VS2012 WPF 设计器不适用于此 XAML 文件。它显示消息设计 View 对于 x64 和 ARM 目标平台不可用。 我收
目前我正在设计 WPF ScrollViewer,我发现了这个 Content="M 0 0 L 4 4 L 0 8 Z" 阅读 MSDN examples .现在我真的很想知道这意味着什么,但我无法
在 WPF 中,元素的可见性可以为“可见”,但实际上在屏幕上不可见,因为它的父元素(或父元素的父元素)具有折叠的可见性。 我希望能够知道一个元素是否实际呈现在屏幕上,而不必遍历可视化树检查父元素。 有
我应该使用 ApplicationCommands.Close用于关闭模式对话框还是该命令被认为是为关闭应用程序保留的?如果是后者,请大家创建Close每个命令 Dialog盒子或只是一个 Close
WPF 是否有任何可用的 piemenu 控件? 最佳答案 我在我的最爱中找到了这个,你可以看看: This 祝你今天过得愉快。 关于wpf - WPF 的菜单,我们在Stack Overflow上找
我正在尝试使用 WrapPanel 和两个 TextBlock 将星号 (*) 附加到某些文本的左侧,允许文本换行,并强制文本右对齐。通过创建一个 FlowDirection 设置为 RightToL
这里是场景(简化):我在Window上有一个控件(比如说一个Rectangle)。我迷上了MouseMove事件,以使其启动拖放操作。然后在MouseDown事件中进行动画处理,向右移动50个像素。但
我有一个 ListView ,它的项目来源是一个列表。我希望用户只选择一项。当我将 listview 的 SelectionMode 设置为 single 时,用户仍然可以选择多个项目,并且似乎 li
就目前而言,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引起辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the he
INotifyPropertyChanged 的目的是什么。我知道每当更改属性时都会触发此事件,但是 View /用户界面如何知道触发了此事件: 这是实现 INotifyPropertyChang
我正在查看工具箱中的 WPF 组件,但找不到 2005/2008 中存在的错误提供程序。 被移除了吗? 最佳答案 ErrorProvider是一个 Winforms 控件。 WPF 中没有等效项。但是
我试图在单击和双击 wpf Image 控件时有不同的行为。不幸的是,单击首先被触发,因此双击被忽略。 最佳答案 如果您改用 MouseDown 事件,则它在 EventArgs 中为 ClickCo
这可能吗? 我使用了一个框架控件并且:显示(例如:showwindow.xaml) 但是我得到这个错误: root element is not valid for navigation 最佳答案 确
我在蓝色背景的窗口上放置了一个扩展器,我想让扩展器的按钮与默认颜色不同(蓝色,它是从窗口接收的)。当我修改扩展器的背景属性时,它会将整个扩展器、标题和全部更改为新颜色。但是,我只想更改按钮本身。谁能指
我是一名优秀的程序员,十分优秀!