除非单步执行代码,否则WPF ViewModel不会设置值

时间:2013-02-20 17:56:08

标签: c# wpf .net-4.0 viewmodel

我在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的引用。

问题:

当我运行此解决方案时,即使我在数据库中有数据,该集合也是空的。所有其他对象加载正常。这里是KICKER ...如果我单步执行调试器并查看facilityResults.Data对象,那么集合就在那里并且将被设置,但是只有我单步执行代码。

ADDITION

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对象及其关联数据带回来。如果仍然不清楚,请告诉我。

1 个答案:

答案 0 :(得分:1)

我不确定你是否理解贾斯汀试图制造这一点。

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

ViewModel.Facility = facilityResults.Data;

ViewModel.FacilityNoticeDetails = facilityResults.Data;

正如BaconSah所说,你实际上没有向我们展示你如何从你的视图中绑定到这个集合。您将需要某种类似于列表框的集合容器,其中itemssource绑定到viewmodel上的FacilityNoticeDetails属性。

我想我也假设您正确连接了OnPropertyChanged代码。

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