WPF ViewModel不设置值,除非在代码中执行步骤

本文关键字:代码 执行 ViewModel 设置 WPF | 更新日期: 2023-09-27 18:00:27

我在WPF.NET Framework 4.0 中工作

我有一个物体叫Facility。这个类包含许多其他对象和对象的集合。我对任何其他对象集合都没有以下问题。

设置:我从列表中选择我的设施。我初始化ViewModel如下:

    var facilityResults = _app.FacilityManager.Get(facility.Id);
            if (facilityResults.Success)
            {
                ViewModel.Facility = facilityResults.Data;
                ViewModel.Facility.PropertyChanged += DataChanged;
            }
            else
            {
                ViewModel.ValidationResults = facilityResults.ManagerActionResultCollection;
                return;
            }

我的收藏定义如下:

    public virtual ObservableCollection<FacilityNoticeDetail> FacilityNoticeDetails
    {
        get { return _facilityNoticeDetails; }
        set
        {
            _facilityNoticeDetails = value;
            OnPropertyChanged("FacilityNoticeDetails");
        }
    }

正如我之前所说的,它的定义就像任何其他对象集合一样。它是虚拟的,所以它知道对FacilityNoticeDetail的引用。

问题:

当我运行这个解决方案时,即使数据库中有数据,那个集合也是空的。所有其他对象加载良好。踢球者来了。。。如果我遍历调试器并查看facilityResults.Data对象,则集合就在那里并将被设置,但前提是我遍历代码。

加法

facilityResults的类型为ManagerActionResult,它是一个自定义类:

    public class ManagerActionResult<T>
{
    public ActionResultCollection ManagerActionResultCollection { get; set; }
    public bool Success { get; set; }
    public T Data { get; set; }
    public ManagerActionResult()
    {
        Success = true;
        ManagerActionResultCollection = new ActionResultCollection();
    }

    public ManagerActionResult(bool valid, string message)
    {
        Success = valid;
        ManagerActionResultCollection = new ActionResultCollection();
    }
}
    public new ManagerActionResult<Facility> Get(int id)
    {
        var result = base.Get(id);
        if (result.Success)
        {
            var facility = result.Data;
            CalculateFeePayments(facility.Fees);
            CalculateContractPayments(facility.Contracts);
        }
        return result;
    }

    public ManagerActionResult<T> Get(int id)
    {
        var result = new ManagerActionResult<T>() { Success = true };
        try
        {
            var set = _context.Set<T>();
            var entity = set.Find(id);
            result.Data = entity;
        }
        catch (Exception ex)
        {
            result.Success = false;
            result.ManagerActionResultCollection.Add(new ErrorActionResult(false, ex.GetBaseException().Message, NotificationSeverityEnum.ERROR, ex.GetBaseException().StackTrace));
            Log.Error(ex.Message);
        }
        return result;
    }

所要做的就是使用上下文将Facility对象及其关联数据带回。如果还不清楚,请告诉我。

WPF ViewModel不设置值,除非在代码中执行步骤

我不确定你是否理解Justin试图表达的观点。

如果您的集合名为FacilityNoticeDetails,则需要更改语句

ViewModel.Facility = facilityResults.Data;

ViewModel.FacilityNoticeDetails = facilityResults.Data;

正如BaconSah所提到的,你实际上并没有向我们展示你是如何从你的角度绑定到这个集合的。您将需要某种集合容器,如列表框,其中itemsource绑定到视图模型上的FacilityNoticeDetails属性。

我想我还假设您已经正确地连接了OnPropertyChanged代码。

这里有一个不错的示例项目,您可以下载作为参考资料。http://archive.msdn.microsoft.com/mag200902MVVM/Release/ProjectReleases.aspx?ReleaseId=2026