1. 程式人生 > >wpf中DataGrid自定義驗證

wpf中DataGrid自定義驗證

   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