У меня есть viewmodel, который реализует 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, у меня нет никаких свойств вмоя модель представления;поэтому я могу использовать только IDataError против ObservableCollection, а не отдельных элементов в коллекции, что мне не помогает, потому что я знаю способ увидеть «внутри» коллекции.Я также не могу использовать IDataError для моего SelectedProjectExpenseItem.Например:
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, он привязан к ItemNumber в ObservableCollection.
Я ищулюбое руководство, поскольку это действительно смущает меня.
---------------------------- РЕДАКТИРОВАТЬ: ---------------------------
Хорошо, я создал отдельную модель представления для моего 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'to' System.Collections.Generic.IList '.Существует явное преобразование (вам не хватает актеров?)
Есть идеи?
---------------------------- РЕДАКТИРОВАТЬ: ----------------------------
Я нашел этоссылка, посмотрим, смогу ли я скопировать то, что делает человек:
Validation-in-a-WPF-DataGrid