共享数据并添加到ObservableCollection时出现InvalidCastException

本文关键字:InvalidCastException ObservableCollection 数据 添加 共享 | 更新日期: 2023-09-27 18:20:52

我正试图使用共享合约将数据从Edge发送到我的UWP应用程序。它就像一个魅力,除了当我试图将以这种方式接收的数据添加到ObservableCollection<T>中时,我得到了这个异常:

InvalidCastException:无法将类型为"System.Collections.Specialized.NotifyCollectionChangedEventHandler"的COM对象强制转换为类类型"System.Collections.Specialized.NomifyCollectionChanged EventHandler"。不能将表示COM组件的类型的实例强制转换为不表示COM组件;但是,只要底层COM组件支持接口IID的QueryInterface调用,它们就可以转换为接口。*

代码如下:

应用程序.xaml.cs:

protected override void OnShareTargetActivated(ShareTargetActivatedEventArgs args)
  {
     if (this.SharingService != null)
        await this.SharingService.OnShareTargetActivated(args);
  }

共享服务.cs:

public delegate void UriAddedEventHandler(object sender, UriAddedEventArgs args);
public event UriAddedEventHandler UriAdded;
public async Task OnShareTargetActivated(ShareTargetActivatedEventArgs args)
{
   var shareOperation = args.ShareOperation;
   if (shareOperation.Data.Contains(StandardDataFormats.WebLink))
   {
      var uri = await shareOperation.Data.GetWebLinkAsync();
      this.UriAdded?
         .Invoke(this, new UriAddedEventArgs { Uri = uri });
   }
}

ViewModel.cs:

public ViewModel(ISharingService sharingService)
{
   sharingService.UriAdded += OnUriAdded;
}
public ObservableCollection<Uri> collection = new ObservableCollection<Uri>();
private async void OnUriAdded(object sender, UriAddedEventArgs args)
{
   this.collection.Add(args.Uri));
}

当然,集合绑定到页面上的一个元素。

当事件触发时,我似乎在另一个线程上(这并不奇怪),但将操作包装在中

await Window.Current.Dispatcher.RunAsync(CoreDispatcherPriority.Normal, ...)

不会改变任何事情,我仍然有例外。有人知道这里发生了什么吗?

编辑:

值得一提的是,我尝试使用.NET原生工具链进行编译,发现了以下警告:

警告:DEP0810:此应用程序引用了您的SDK中的Microsoft.NET Native.Runtime 1.1版本1.1.23231.0,但您在目标计算机1.1.23406.0上安装了更高版本的Microsoft.NET。Native。Runtime 1.1。如果继续运行此应用程序,它将针对当前安装的Microsoft.NET Native.Runtime.1.1版本1.1.23406.0运行。请考虑更新您的SDK,使其与已安装的Microsoft.NET Native Runtime 1.1版本相匹配。

所以,是的,我开始怀疑这里有一些版本冲突。我安装了最新的Windows 10 SDK(10.0.26624.0),所以我不确定如何按照上面的警告中的建议更新我的SDK。

共享数据并添加到ObservableCollection时出现InvalidCastException

每个窗口(主应用程序和共享窗口)都有唯一的调度器。

不能直接将UI或调度程序从一个窗口引用到另一个窗口。

可以调用后台线程,然后使用其他窗口的调度器。

我的建议是去掉调度器的所有全局getter,并使用页面的调度器(this.dispatcher)。最佳做法是使用要在其上显示内容的相应控件或页面的调度器。

相关文章:
  • 没有找到相关文章