我有一个实现 IDataError 的视图模型。在视图模型中,我有一个 ObservableCollection。ObservableCollection 在我的视图中填充了一个数据网格:
// the list that populates the datagrid
public ObservableCollection<ProjectExpenseItemsDto> ListOfProjectExpenseItems
{
get { return listOfProjectExpenseItems; }
set
{
if (listOfProjectExpenseItems != value)
{
listOfProjectExpenseItems = value;
NotifyPropertyChanged("ListOfProjectExpenseItems");
}
}
}
我还有一个表示数据网格中选定项目的属性(它基于 Dto):
// the selected row in the datagrid
public ProjectExpenseItemsDto SelectedProjectExpenseItem
{
get { return selectedProjectExpenseItem; }
set
{
if (selectedProjectExpenseItem != value)
{
selectedProjectExpenseItem = value;
NotifyPropertyChanged("SelectedProjectExpenseItem");
}
}
}
这是Dto:
namespace ProjectExpense.Model.Dto
{
[DataContract]
public class ProjectExpenseItemsDto
{
[DataMember]
public int RowID { get; set; }
[DataMember]
public int ProjectExpenseID { get; set; }
[DataMember]
public string ItemNumber { get; set; }
[DataMember]
public string ItemDescription { get; set; }
[DataMember]
public decimal ItemUnitPrice { get; set; }
[DataMember]
public decimal ItemQty { get; set; }
[DataMember]
public string SupplierName { get; set; }
[DataMember]
public DateTime CreateDate { get; set; }
}
}
我想使用 IDataError 来验证数据网格(SelectedProjectExpenseItem)的选定行中的值,但由于我的网格绑定到 ObservableCollection,我的视图模型中没有任何属性;因此,我只能对 ObservableCollection 使用 IDataError,而不是集合中的单个项目,这对我没有帮助,因为我知道如何查看集合的“内部”。我也不能对我的 SelectedProjectExpenseItem 使用 IDataError。例如:
string IDataErrorInfo.this[string propertyName]
{
get
{
string result = string.Empty;
propertyName = propertyName ?? string.Empty;
if (propertyName == string.Empty || propertyName == "ItemNumber")
{
if (string.IsNullOrEmpty(SelectedProjectExpenseItem.ItemNumber))
{
result = "Name cannot be blank!";
}
}
return result;
}
}
这不会触发,因为我的数据网格列未绑定到 SelectedProjectExpenseItem.ItemNumber,它绑定到 ObservableCollection 中的 ItemNumber。
我正在寻找任何指导,因为这真的让我很困惑。
- - - - - - - - - - - - - - 编辑: - - - - - - - - - - --------
好的,我为我的 DTO 创建了一个单独的视图模型:
namespace ProjectExpense.ViewModels
{
public class ProjectExpenseItemsDtoViewModel : ProjectExpenseItemsDto, IDataErrorInfo
{
public ProjectExpenseItemsDtoViewModel()
{
Initialize();
}
private void Initialize()
{
}
#region Validation
// string method
static bool IsStringMissing(string value)
{
return String.IsNullOrEmpty(value) || value.Trim() == String.Empty;
}
#endregion
#region IDataErrorInfo Members
public string Error
{
get
{
return this[string.Empty];
}
}
public string this[string propertyName]
{
get
{
string result = string.Empty;
if (propertyName == "ItemNumber")
{
if (IsStringMissing(this.ItemNumber))
result = "Item number cannot be empty!";
if (this.ItemNumber.Length > 50)
return "Item number exceeds 50 characters";
}
return result;
}
}
#endregion
}
}
现在,我的主虚拟机中的以下行出现问题:
IList<ProjectExpenseItemsDtoViewModel> iList = projectExpenseItemsRepository.GetProjectExpenseItems(ProjectExpenseID);
foreach (ProjectExpenseItemsDtoViewModel item in iList)
ListOfProjectExpenseItems.Add(item);
它说:
无法将类型“System.Collections.Generic.IList”隐式转换为“System.Collections.Generic.IList”。存在显式转换(您是否缺少演员表?)
有任何想法吗?
- - - - - - - - - - - - - - 编辑: - - - - - - - - - - --------
我找到了这个链接,看看我是否可以复制这个人在做什么: