Xaml 添加到ObservableCollection的项已成功,但仍引发异常

Xaml 添加到ObservableCollection的项已成功,但仍引发异常,xaml,win-universal-app,xamarin.forms,Xaml,Win Universal App,Xamarin.forms,``我完全搞不懂为什么会出现这样的错误: 发生System.NullReferenceException异常 HResult=-2147467261 Message=对象引用未设置为对象的实例。 Source=Xamarin.Forms.Platform.UAP 堆栈跟踪: 在Xamarin.Forms.Platform.UWP.WindowsBasePlatformServices.get_IsInvokeRequired()中 位于Xamarin.Forms.ListProxy.OnColl

``我完全搞不懂为什么会出现这样的错误:

发生System.NullReferenceException异常 HResult=-2147467261 Message=对象引用未设置为对象的实例。 Source=Xamarin.Forms.Platform.UAP 堆栈跟踪: 在Xamarin.Forms.Platform.UWP.WindowsBasePlatformServices.get_IsInvokeRequired()中 位于Xamarin.Forms.ListProxy.OnCollectionChanged(对象发送方,NotifyCollectionChangedEventArgs e) 在Xamarin.Forms.ListProxy.WeanKnotifyProxy.OnCollectionChanged(对象发送者,NotifyCollectionChangedEventArgs e) 位于System.Collections.ObjectModel.ObservableCollection
1.OnCollectionChanged(NotifyCollectionChangedEventArgs e)
位于System.Collections.ObjectModel.ObservableCollection
1.InsertItem(Int32索引,T项) 位于System.Collections.ObjectModel.Collection`1.Add(T项) 在ViewModels.ScanBadgesViewModel.Add处(BadgeScan结果) 内部异常:

错误由以下行产生:

EmployeeId.Add(badge.EmployeeId)

注意: 在Xamarin.Forms Windows 10通用应用程序(预览)上观察到此错误

如果我注释掉XAML中的ListView元素,那么我将不再收到null异常

如果我只注释掉ListView的ItemTemplate,那么我仍然观察到null异常

XAML:

    <Grid Grid.Row="4" Grid.RowSpacing="3" Grid.ColumnSpacing="3" BackgroundColor="Silver">
        <ListView ItemsSource="{Binding EmployeeIds}" SelectedItem="{Binding SelectedEmployeeId}"
                  BackgroundColor="Black">
          <ListView.ItemTemplate>
            <DataTemplate>
              <ViewCell>
                <ViewCell.View>
                    <Label Text="{Binding Value}" TextColor="Yellow" XAlign="Start" />
                </ViewCell.View>
              </ViewCell>
            </DataTemplate>
          </ListView.ItemTemplate>
        </ListView>
      </Grid>
        ObservableCollection<EmployeeId> _employeeIds = new ObservableCollection<EmployeeId>();
        public ObservableCollection<EmployeeId> EmployeeIds
        {
            get { return _employeeIds; }
            set
            {
                if (_employeeIds != value)
                {
                    _employeeIds = value;
                    OnNotifyPropertyChanged();
                }
            }
        }
    public class EmployeeId
    {
        public EmployeeId(string employeeId) { Value = employeeId; }

        public string Value { get; }
    }

    public class BadgeScan
    {
        public BadgeScan(string employeeId) { EmployeeId = new EmployeeId(employeeId); }

        public BadgeScan(BadgeScan source, Predicate<string> validate) : this(source.EmployeeId.Value)
        {
            IsValid = validate.Invoke(source.EmployeeId.Value);
        }

        public EmployeeId EmployeeId { get; }

        public bool IsValid { get; }
    }
_employeeIdsHack.Add(administeredScan.EmployeeId);
EmployeeIds = new ObservableCollection<EmployeeId>(_employeeIdsHack);
该行仅创建对象的副本

var validate = DependencyManager.Resolve(typeof(Predicate<string>)) as Predicate<string>;

var administeredScan = new BadgeScan(result, validate);
var canAdd = CanAdd(administeredScan) && 
             ScanMode == Entities.ScanMode.Add;

if (canAdd) Add(administeredScan);
break;

因此,创建一个对象的副本以添加到我的可观察对象中失败了。但是添加原始对象成功。

您的属性是只读的。我会将属性更改为具有私有集

        public EmployeeId EmployeeId { get; private set; }

        public bool IsValid { get; private set;}

您的第二个
BadgeScan
构造函数没有初始化
EmployeeId
属性。在这方面:

EmployeeIds.Add(badge.EmployeeId);
…您可能正在向集合中添加
null
对象。这本身不应该是个问题,但您正在数据绑定中使用
EmployeeId.Value
。我猜NRE与此有关



更新:@ScottNimrod说这是一个Xamarin bug,在这种情况下,NRE可能根本就没有联系。即便如此:
EmployeeId的非设置是故意的吗?

这是针对Windows通用平台(即Windows 10)的Xamarin.Forms错误。

我没有对UI数据绑定到的ObservaleCollection调用Add操作,而是为每个Add操作创建一个新的ObservaleCollection,并在构造函数中传入一个集合

解决方法:

    <Grid Grid.Row="4" Grid.RowSpacing="3" Grid.ColumnSpacing="3" BackgroundColor="Silver">
        <ListView ItemsSource="{Binding EmployeeIds}" SelectedItem="{Binding SelectedEmployeeId}"
                  BackgroundColor="Black">
          <ListView.ItemTemplate>
            <DataTemplate>
              <ViewCell>
                <ViewCell.View>
                    <Label Text="{Binding Value}" TextColor="Yellow" XAlign="Start" />
                </ViewCell.View>
              </ViewCell>
            </DataTemplate>
          </ListView.ItemTemplate>
        </ListView>
      </Grid>
        ObservableCollection<EmployeeId> _employeeIds = new ObservableCollection<EmployeeId>();
        public ObservableCollection<EmployeeId> EmployeeIds
        {
            get { return _employeeIds; }
            set
            {
                if (_employeeIds != value)
                {
                    _employeeIds = value;
                    OnNotifyPropertyChanged();
                }
            }
        }
    public class EmployeeId
    {
        public EmployeeId(string employeeId) { Value = employeeId; }

        public string Value { get; }
    }

    public class BadgeScan
    {
        public BadgeScan(string employeeId) { EmployeeId = new EmployeeId(employeeId); }

        public BadgeScan(BadgeScan source, Predicate<string> validate) : this(source.EmployeeId.Value)
        {
            IsValid = validate.Invoke(source.EmployeeId.Value);
        }

        public EmployeeId EmployeeId { get; }

        public bool IsValid { get; }
    }
_employeeIdsHack.Add(administeredScan.EmployeeId);
EmployeeIds = new ObservableCollection<EmployeeId>(_employeeIdsHack);
\u employeeIdsHack.Add(administeredScan.EmployeeId);
EmployeeIds=新的可观察集合(_employeeIdsHack);

我在Xamarin.Forms中遇到了一个与android开发类似的错误。但当我尝试添加项目时,得到的异常是超出范围的异常。使用这个答案解决了这个问题。