我在我的視圖模型下面的驗證方法(例如正顯示出只有一列,「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中。
任何幫助表示讚賞。
在這種情況下,我一直在用IDataErrorInfo實現包裝DTO和ViewModel。 但它聽起來像你想繼續使用DTO ... – Andrii 2010-06-24 19:18:13
我不反對把我的dto的屬性放在我的viewmodel中,但是我必須重寫代碼才能這樣做。也許這是更好的選擇... – steveareeno 2010-06-24 20:12:37
現在我測試了它,IDataError甚至沒有在我的datagrid列上觸發。我有一個布爾IsValid屬性綁定到保存按鈕,它調用驗證。我可能不得不重新考慮這一點。 – steveareeno 2010-06-24 20:27:00