2010-06-24 61 views
1

我在我的視圖模型下面的驗證方法(例如正顯示出只有一列,「ItemNumber」):驗證使用IDataError

public bool IsValid 
{ 
    get 
    { 
    foreach (string property in ValidatedProperties) 
     if (GetValidationError(property) != null) 
     return false; 

    return true; 
    } 
} 

static readonly string[] ValidatedProperties = 
{ 
    "ItemNumber" 
}; 

string GetValidationError(string propertyName) 
{ 
    if (Array.IndexOf(ValidatedProperties, propertyName) < 0) 
    return null; 

    string error = null; 

    switch (propertyName) 
    { 
    case "ItemNumber": 
     error = this.ValidateItemNumber(); 
     break; 
    default: 
     Debug.Fail("Unexpected property being validated on ProjectExpense: " + propertyName); 
     break; 
    } 
    // set the status message on the UI to the generated error 
    if (error != null) 
    { 
    ErrorMessage = error; 
    } 

    return error; 
} 

// string method 
static bool IsStringMissing(string value) 
{ 
    return String.IsNullOrEmpty(value) || value.Trim() == String.Empty; 
} 

string ValidateItemNumber() 
{ 
    if (SelectedProjectExpenseItem != null) 
    { 
    if (IsStringMissing(SelectedProjectExpenseItem.ItemNumber)) 
    { 
     return "Item number is required"; 
    } 
    if (SelectedProjectExpenseItem.ItemNumber.Length > 50) 
    { 
     return "Item number exceeds 50 characters"; 
    } 
    } 
    return null; 
} 

#endregion 


#region IDataErrorInfo Members 

string IDataErrorInfo.Error { get { return null; } } 

string IDataErrorInfo.this[string propertyName] 
{ 
    get { return this.GetValidationError(propertyName); } 
} 

驗證火災,但我不知道如何把它傳達給我的數據網格。我正在使用單獨的Dto(因此SelectedProjectExpenseItem.ItemNumber上面,SelectedProjectExpenseItem是我的Dto),而不是直接在我的viewmodel中具有屬性。這是我的DataGrid:

<DataGrid ItemsSource="{Binding Path=ListOfProjectExpenseItems}" AutoGenerateColumns="False" 
     Name="dgProjectExpenseItems" SelectionMode="Single" SelectionUnit="FullRow" CanUserResizeColumns="True" 
     SelectedItem="{Binding Path=SelectedProjectExpenseItem, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" GridLinesVisibility="Horizontal" CanUserDeleteRows="True" CanUserAddRows="True"> 
    <DataGrid.Columns> 
     <DataGridTextColumn Header="ID" Width="SizeToCells" MinWidth="50" Binding="{Binding RowID}" /> 
     <DataGridTextColumn Header="Project Expense ID" Width="SizeToCells" Visibility="Hidden" MinWidth="0" Binding="{Binding ProjectExpenseID, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" /> 
     <DataGridTextColumn Header="Item Number" Width="SizeToCells" MinWidth="140" Binding="{Binding ItemNumber, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" /> 
     <DataGridTextColumn Header="Item Description" Width="SizeToCells" MinWidth="250" Binding="{Binding ItemDescription, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" /> 
     <DataGridTextColumn Header="Unit Price" Width="SizeToCells" MinWidth="90" Binding="{Binding ItemUnitPrice, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" /> 
     <DataGridTextColumn Header="Qty" Width="SizeToCells" MinWidth="65" Binding="{Binding ItemQty, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" /> 
     <DataGridTextColumn Header="Supplier Name" Width="SizeToCells" MinWidth="200" Binding="{Binding SupplierName, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" /> 
    </DataGrid.Columns> 
    </DataGrid> 

我想用一種風格,與說紅色邊框和工具提示指出錯誤,以表示有問題的行或單元格。但是,我使用樣式找到的每個示例都直接在視圖模型中具有屬性,我無法弄清楚如何將它移植到我的Dto中。

任何幫助表示讚賞。

+0

在這種情況下,我一直在用IDataErrorInfo實現包裝DTO和ViewModel。 但它聽起來像你想繼續使用DTO ... – Andrii 2010-06-24 19:18:13

+0

我不反對把我的dto的屬性放在我的viewmodel中,但是我必須重寫代碼才能這樣做。也許這是更好的選擇... – steveareeno 2010-06-24 20:12:37

+0

現在我測試了它,IDataError甚至沒有在我的datagrid列上觸發。我有一個布爾IsValid屬性綁定到保存按鈕,它調用驗證。我可能不得不重新考慮這一點。 – steveareeno 2010-06-24 20:27:00

回答

0

的問題必須用DTO在我的實現做,或至少缺乏在其中實現IDataErrorInfo的的。我決定將它們轉儲並使用實現IDataErroInfo和wa-la的直接業務對象,現在一切都很好用。

0

你有沒有ValidatesOnDataErrors=True, ValidatesOnExceptions=True, NotifyOnValidationError=true活動你的綁定?

+0

我有ValidatesOnDataErrors = True,但不是其他人。讓我試試看...... – steveareeno 2010-06-25 15:06:32

+0

好的,我把它放在那裏,但我認爲我的問題是IDataErrorInfo甚至沒有解僱。一旦我發現這一點,我開始了另一篇文章。我認爲這與我的dg被綁定到一個ObservableCollection有關,並且沒有在我的虛擬機中單獨指定爲屬性的字段。 – steveareeno 2010-06-25 15:10:01