gpt4 book ai didi

wpf - ObservableCollection 上的 IDataErrorInfo

转载 作者:行者123 更新时间:2023-12-03 10:20:01 25 4
gpt4 key购买 nike

我有一个实现 IDataError 的 View 模型。在 View 模型中,我有一个 ObservableCollection。 ObservableCollection 在我的 View 中填充了一个数据网格:

    // 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)的选定行中的值,但由于我的网格绑定(bind)到 ObservableCollection,我的 View 模型中没有任何属性;因此,我只能针对 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;
}
}

这不会触发,因为我的数据网格列未绑定(bind)到 SelectedProjectExpenseItem.ItemNumber,它绑定(bind)到 ObservableCollection 中的 ItemNumber。

我正在寻找任何指导,因为这真的让我很困惑。

- - - - - - - - - - - - - - 编辑: - - - - - - - - - - --------

好的,我为我的 DTO 创建了一个单独的 View 模型:
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”。存在显式转换(您是否缺少类型转换?)

有任何想法吗?

- - - - - - - - - - - - - - 编辑: - - - - - - - - - - --------

我找到了这个链接,看看我是否可以复制这个人在做什么:

Validation-in-a-WPF-DataGrid

最佳答案

而不是使用 ObservableCollectionProjectExpenseItemsDto ,为 ProjectExpenseItemsDto 创建一个 ViewModel键入 (I.E. : ProjectExpenseItemsDtoViewModel) 并使其实现 IDataErrorInfo接口(interface),然后使用 ObservableCollection<ProjectExpenseItemsDtoViewModel>作为主 ViewModel 中的属性。

关于wpf - ObservableCollection 上的 IDataErrorInfo,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3114025/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com