通过方法访问时,对象不保存实例

时间:2014-10-06 09:19:35

标签: c# .net xaml data-binding observablecollection

我创建了一个Model Class“RestaurentList”,它使用json文件中的数据填充两个集合。 在我的ViewModel中将对象实例化到类之后,我将集合数据绑定到ItemsControl。

上面的所有内容都可以正常工作,但是当我从ViewModel中的对象调用方法populatePartialList时,它不包含我实例化对象时的任何数据。 这意味着,当我的方法尝试重新填充PartialList时,它不能,因为它没有从FullList中找到数据。

编辑:我遗漏了一些代码,你可以看到评论标签。 我只是想让你了解我是如何做到的。

我的问题基本上是,当我调用方法populatePartialList时,为什么对象不包含任何数据。

我猜这与事实有关,我将List数据绑定到ItemsControl,因此无法访问它?那么在那种情况下该怎么办呢?我试图做一个非常简单的分页

编辑到上面;我试图删除我的Bind,但仍然无法获取数据。

型号:

public class RestaurentList
    {
        private ObservableCollection<Restaurent> _fullList = new ObservableCollection<Restaurent>();

        private ObservableCollection<Restaurent> _partialList = new ObservableCollection<Restaurent>();

        public ObservableCollection<Restaurent> FullList
        {
            get { return _fullList; }
        }

        public ObservableCollection<Restaurent> PartialList
        {
            get { return _partialList; }
        }

        public RestaurentList()
        {
            populateList();
        }

        public void populatePartialList(int fromValue = 1)
        {
            int collectionAmount = _fullList.Count;
            int itemsToShow = 2;
            fromValue = (fromValue > collectionAmount ? 1 : fromValue);

            foreach (Restaurent currentRestaurent in _fullList)
            {
                int currentId = Convert.ToInt32(currentRestaurent.UniqueId);
                if (currentId == fromValue || (currentId > fromValue && currentId <= (fromValue + itemsToShow)-1))
                {
                    _partialList.Add(currentRestaurent);
                }
            }
        } 

        private async void populateList()
        {
            // Get json data

            foreach (JsonValue restaurentValue in jsonArray)
            {
                // populate full list

                foreach (JsonValue menuValue in restaurentObject["Menu"].GetArray())
                {
                    // populate full list
                }
                this._fullList.Add(restaurent);
            }
            populatePartialList();
        }

        public override string ToString()
        {
            // Code
        }
    }

查看型号:

class ViewModelDefault : INotifyPropertyChanged
    {


        private RestaurentList _list;

        public ObservableCollection<Restaurent> List
        {
            get { return _list.PartialList; }
        }


        public ViewModelDefault()
        {  
            _list = new RestaurentList();
            _list.populatePartialList(2); // This is where i don't see the data from RestaurentList
        }

        #region Notify
    }

编辑Jon:

public RestaurentList()
        {
            PopulatePartialList();
        }

        public async void PopulatePartialList(int fromValue = 1)
        {
            await PopulateList();
            int collectionAmount =  _fullList.Count;
            int itemsToShow = 2;
            fromValue = (fromValue > collectionAmount ? 1 : fromValue);

            foreach (Restaurent currentRestaurent in _fullList)
            {
                int currentId = Convert.ToInt32(currentRestaurent.UniqueId);
                if (currentId == fromValue || (currentId > fromValue && currentId <= (fromValue + itemsToShow)-1))
                {
                    _partialList.Add(currentRestaurent);
                }
            }
        } 

        private async Task PopulateList()
        {
}

1 个答案:

答案 0 :(得分:0)

在致电populatePartialList之前,请查看代码行:

_list = new RestaurentList();

您已创建RestaurentList的新实例。这将调用populateList(),但等待它完成。假设您的populateList实际执行包含await次操作,这意味着您的populatePartialList(2)调用几乎肯定会在数据准备好之前发生。

您需要考虑异步在这里如何工作,以及您希望如何工作。请注意,虽然您不能拥有异步构造函数,但您可以使用异步静态方法......对于ViewModelDefaultRestaurentList来说,这可能是一个更好的主意。