【问题标题】:ObservableCollection Binding Exception - ListView ItemSource XamarinObservableCollection 绑定异常 - ListView ItemSource Xamarin
【发布时间】:2018-01-21 07:10:52
【问题描述】:

我想将一个列表视图绑定到我的视图模型,但我得到了ArgumentNullException。 我使用 xamarin.forms,异常出现在 android 和 ios 项目中,但 不在 uwp 中。

当我对视图模型使用绑定时,Itemsource 返回异常。当我不在我的 xaml 中使用绑定时,异常就会消失。

System.ArgumentNullException has been thrown
Value cannot be null.
Parameter name: element

视图模型

private ObservableCollection<T> pages = new ObservableCollection<T>();

        public ObservableCollection<T> Pages 
        {
            get { return pages; }
            set
            {
                pages = value;
                OnPropertyChanged("Pages");
            }
        }

虚拟机构造器

public ViewModel()
{
    _service = new Service();
    someitems = _service.getitems();
    Pages = new ObservableCollection<T>(someitems);;
}

服务

return new ObservableCollection&lt;T&gt;(items);

查看

ItemsSource="{Binding Pages}"

问题似乎出在 setter pages = value;

怎么了?

【问题讨论】:

  • 你的OnPropertyChanged()方法中有什么?
  • @slugster var handler = PropertyChanged; if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName));

标签: c# exception xamarin binding xamarin.forms


【解决方案1】:

根据发布的代码,您似乎正在尝试使用 null 值初始化 Pages 集合。

public ViewModel()
{
    Pages = new ObservableCollection<T>(someitems);;
}

在您的 ViewModel 构造函数中,someitems 似乎为空。我假设这是因为您使用的是Generics,而那时您可能不知道要使用的类型。

如果你想/需要用一个值初始化它,你可以在 ViewModel 构造函数中传递一个参数:

public ViewModel(IList<T> someitems)
{
    Pages = new ObservableCollection<T>(someitems);
}

注意:在使用ObservableCollection 时,您不需要创建支持字段,使用自动属性就足够了,但请注意,使用它您必须保持相同的实例和替换对象时,您将清除 Clear() 并添加 Add() 新项目。

public ObservableCollection<T> Pages { get; set; }

希望这会有所帮助!

【讨论】:

  • 看起来someitems 为空,但它不是我从调试中看到的那样。该问题仅出现在 ios 和 android 中,在 uwp 中 listview 工作正常。我使用了笔记,但我遇到了同样的问题。
  • 如果您从集合初始化中删除someitems,会发生什么?崩溃了?
  • 它似乎为空,因此异常。你能用完整的 ViewModel 更新原始帖子吗?
  • 我看到的是程序没有等待您的服务结果(您不应该在类的构造函数中执行繁重的操作)并且它仍在继续,将 someitems 保留为 null .一个可能的解决方案是将集合初始化为空,然后使用Command 发送来获取数据并更新属性,这将通知 UI 相应地刷新。
  • 您的声明“您在使用 ObservableCollection 时不需要创建支持字段,使用 Auto-Property 就足够了” 并不完全准确。您可以只使用一个自动属性,但是如果集合被换成新的(或者当属性最初被填充时),绑定子系统不会收到通知。
【解决方案2】:

我将我的服务更改为async数据源,最后我使用了:

构造函数

public ViewModel()
{
   InitPages();
}

异步初始化()

private async void Init()
{
   Pages = await ServiceFunction();
}

【讨论】:

    猜你喜欢
    • 2012-07-13
    • 2018-10-03
    • 1970-01-01
    • 2014-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-26
    相关资源
    最近更新 更多