У меня есть viewmodel, который реализует IDataError. В viewmodel у меня есть ObservableCollection. ObservableCollection заполняет DataGrid, на мой взгляд:IDataErrorInfo on 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 для проверки значений в выбранной строке DataGrid (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;
}
}
это не срабатывает, потому что моя колонка DataGrid не связан с SelectedProjectExpenseItem.ItemNumber, он связан с ItemNumber в ObservableCollection.
Я ищу любое руководство, так как это меня действительно сбивает с толку.
---------------------------- EDIT: --------------- -------------
Хорошо, я создал отдельный ViewModel для моего 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
}
}
Теперь у меня возникли проблемы с помощью следующей строки в моей основной VM :
IList<ProjectExpenseItemsDtoViewModel> iList = projectExpenseItemsRepository.GetProjectExpenseItems(ProjectExpenseID);
foreach (ProjectExpenseItemsDtoViewModel item in iList)
ListOfProjectExpenseItems.Add(item);
Он говорит:
Невозможно неявно преобразовать тип 'System.Collections.Generic.IList' в 'System.Collections.Generic.IList'. Явное преобразование существует (вы пропускаете литье?)
Любые идеи?
---------------------------- EDIT: --------------- -------------
Я нашел эту ссылку, буду ли я копировать то, что делает человек:
Вы хотите создать отдельный vm для dto и использовать это vm в главном? Будет ли dto vm реализовывать какие-либо свойства, такие как имена полей из Dto? Хммм, позвольте мне взглянуть на это. Я вернусь после того, как попробую. Благодарю. – steveareeno
Ненавижу быть беспокойством, но не могли бы вы привести мне пример того, как этот vm может выглядеть? – steveareeno
Возможно, вам нужно взглянуть на этот пример: http://www.codeproject.com/KB/WPF/WPFDataGridExamples.aspx#errorinfo, его та же идея. –