wpf中DataGrid自定義驗證
阿新 • • 發佈:2019-01-30
DataGrid在Wpf中的應用是十分廣泛的,當你需要表中的資訊稍詳細的顯示出來時,或者我們需要進行某些資料輸入時,都有可能採用DataGrid。當然對資訊的顯示,我們不需要進行驗證,但當我們將DataGrid作為輸入工具時,輸入的資料要符合相應的規則後才能通過,這時我們就需呀進行驗證了。
對於DataGrid的驗證有兩種,一種是對每個DataGridCell而言的,也就是說當每個被驗證的Cell編輯完成後,就會觸發驗證;另一種是針對DataGridRow而言的,就是當整行編輯完成之後觸發驗證。兩者的選擇就要根據具體的情況而定了。
對於驗證的實現,一般也分為兩種方法,一種是實現IDataErrorInfo介面來完成驗證,另一種則是需要繼承ValidationRule來完成自定義的驗證。本文主要針對後者進行說明。隨後也會附上DEMO。
我們在WPF頁中用DataGrid對多有的學生Student資訊進行顯示,但更重要的是我們要在DataGrid中對學生列表進行新增或編輯。
其中Student類中定義了Name、Sex、Num、Check等屬性,對每個Student的每個屬性我們要求都不為空,對於這點,我們用整行驗證和各個Cell進行驗證都是可以的,但是對於Num和check我們有要求:Num為分數等級,只有當它為A或B的時候Check才為true(表通過),這時用整行的驗證做起來比較簡單,也就是說當驗證每個實體屬性間關係時用整行驗證來說比較方便。
要驗student中屬性間存在的關係,我們需要編寫驗證規則如下:
//自定義驗證規則 public class StudentValidationRule:ValidationRule { public static string errormessage = string.Empty; public override ValidationResult Validate(object value, System.Globalization.CultureInfo cultureInfo) { errormessage = ""; if (value is BindingGroup) { BindingGroup group = (BindingGroup)value; foreach (var item in group.Items) { student st = item as student; if (string.IsNullOrEmpty(st.Name.Trim()) || string.IsNullOrEmpty(st.Sex.Trim()) || string.IsNullOrEmpty(st.Num.Trim())) { errormessage = "姓名、性別、成績都不能為空!"; return new ValidationResult(false, "姓名、性別、成績都不能為空!"); } //Num為A或B則通過,為C則為不通過。 if ((st.Num.Equals("C") && st.Chek) || ((st.Num.Equals("A") || st.Num.Equals("B")) && !st.Chek)) { errormessage = "分數等級與是否通過不符!"; return new ValidationResult(false, "分數等級與是否通過不符!"); } } } return ValidationResult.ValidResult; } }
其中BindingGroup包含用於驗證物件繫結和ValidationRule 物件的集合.當我們定義好自己的驗證時,我們需要將規則部署到DataGrid上,前臺部署:
<DataGrid AutoGenerateColumns="False" CanUserAddRows="False" CanUserDeleteRows="True" Canvas.Top="0" Name="dg" Width="500" IsReadOnly="False" BeginningEdit="dg_BeginningEdit" CellEditEnding="dg_CellEditEnding" LostFocus="dg_LostFocus" SelectedCellsChanged="dg_SelectedCellsChanged"
RowStyle="{StaticResource RowStyle}" SelectionChanged="dg_SelectionChanged" RowEditEnding="dg_RowEditEnding">
<DataGrid.RowValidationRules>
<local:StudentValidationRule ValidationStep="UpdatedValue"/>
</DataGrid.RowValidationRules>
<DataGrid.Columns>
<DataGridTextColumn Binding="{Binding Path=Name}" Header="姓名" Width="100"/>
<DataGridTextColumn Binding="{Binding Path=Sex}" Header="性別" Width="100"/>
<DataGridTemplateColumn Header="分數" >
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<TextBlock Text="{Binding Path=Num}"/>
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
<DataGridTemplateColumn.CellEditingTemplate>
<DataTemplate>
<ComboBox x:Name="taskcob"
SelectedValue="{Binding Num}"
ItemsSource="{Binding Type,Source={StaticResource So} }"
/>
</DataTemplate>
</DataGridTemplateColumn.CellEditingTemplate>
</DataGridTemplateColumn>
<DataGridCheckBoxColumn Binding="{Binding Path=Chek}" Header="是否通過" Width="*"/>
</DataGrid.Columns>
</DataGrid>
如上所示,DataGrid.RowValidationRules給該Datagrid指定了驗證的規則,ValidationStep則設定在何時觸發該驗證。DataGrid中我們對RowStyle屬性進行了設定;也就是當驗證未通過時,系統會反饋到介面,提醒使用者哪裡出錯了;對於樣式的編寫,多種多樣,大家可根據自己的喜好編寫樣式。當datagrid中出現驗證錯誤時,系統將會把編輯行鎖定為出錯行,此時其他行是禁止被編輯的,直到該行中的驗證全部通過為止。
執行如下:
程式碼下載地址DEMO