【问题标题】:MvvmCross vNext: ObservableColletion is defined in an assembly that is not referencedMvvmCross vNext:ObservableColletion 定义在未引用的程序集中
【发布时间】:2012-11-02 14:48:40
【问题描述】:

我现在要构建我的 PCL 模型,这需要一些时间来制作插件,但是现在在我的 Android UI 项目中,我在构建它时遇到了两个错误。

第一个错误是:

The type 'System.Collections.ObjectModel.ObservableCollection`1<T0>' is defined in an assembly that is not referenced.
You must add a reference to assembly 'System.Windows, Version=2.0.5.0, Culture=neutral, PublicKeyToken=7cec85d7bea7798e,
Retargetable=Yes'.  C:\ENM\Main\src\prod\Mobile\Stakeholder\UI.Android.vNext\Views\LocationsMapView.cs  40  32  UI.Android.vNext

第二个错误是:

foreach statement cannot operate on variables of type 
'System.Collections.ObjectModel.ObservableCollection`1<BK.EMS.Stakeholder.Model.ViewModels.LocationViewModel>' 
because 'System.Collections.ObjectModel.ObservableCollection`1<BK.EMS.Stakeholder.Model.ViewModels.LocationViewModel>' 
does not contain a public definition for 'GetEnumerator'
C:\ENM\Main\src\prod\Mobile\Stakeholder\UI.Android.vNext\Views\LocationsMapView.cs  40  32  UI.Android.vNext

我已经从System.Windows.Droid 项目中引用了System.Windows 程序集,它应该转发ObservableCollection&lt;&gt;

发生错误的行:

private void AddLocationOverlays()
{
    if (_itemizedOverlay.Size() > 0) _itemizedOverlay.ClearOverlayItems();
    RunOnUiThread(() =>
    {
        foreach (var location in ViewModel.Locations)
        {
            _itemizedOverlay.AddOverlayItem(location);
        }
        _mapView.Invalidate();
    });
}

我的 ViewModel 中的 Locations 属性如下所示:

public ObservableCollection<LocationViewModel> Locations
{
    get { return _locations; } 
    set
    {
        _locations = value;
        RaisePropertyChanged(() => Locations);
    }
}

没有什么太复杂,在非 PCL 模型中也能正常工作...

那么我该如何解决这个问题呢?

【问题讨论】:

    标签: xamarin.android portable-class-library mvvmcross


    【解决方案1】:

    我们现在有了解决这个问题的方法 - 请参阅 Daniel Plaisted 在Portable Class Library strong assembly reference problems in MonoTouch/MonoDroid 中的修复

    此修复在https://github.com/slodge/MvvmCross/commit/f6a88048467838e5ac5ca687744dc0b2d1958aa8签入

    【讨论】:

      【解决方案2】:

      更新:查看其他答案。看来我们现在有了解决这个问题的办法!


      我相信这与这个问题有关 - Portable Class Library strong assembly reference problems in MonoTouch/MonoDroid

      链接到:https://github.com/slodge/MvvmCross/issues/41

      这是与 Xamarin 一起作为错误提出的:https://bugzilla.xamarin.com/show_bug.cgi?id=8035

      恐怕我现在不了解推荐的强签名解决方案。

      请对错误报告进行投票,以提醒 Microsoft PCL 和 Xamarin 团队注意这一点。 MS 和 Xamarin 团队正在就此(尽管通过我!)相互交谈,我希望我们能找到一种方法让 Microsoft 或 Xamarin 发布一些签名的 DLL。


      与此同时,一些可能的解决方法是:

      1. 使用 IEnumerable 访问而不是 ObservableCollection - 集合仍然可以是 ObservableCollection 实例,只是不要在 UI 代码中将其作为 ObservableCollection 引用。

      2. 尝试将您的迭代代码放在类库中而不是应用程序项目中 - 感觉很奇怪,编译器似乎非常乐意在库中而不是应用程序中构建相同的代码

      3. 尝试使用 Mono 编译器在 MonoDevelop 中构建 - 这似乎没有相同的强名称引用检查。


      看看你的示例代码,我想试试:

      private ObservableCollection<LocationViewModel> _locations;
      public IEnumerable<LocationViewModel> Locations
      {
          get { return _locations; } 
          set
          {
              if (value != null && !(value is ObservableCollection<LocationViewModel>)
              {
                  throw new Exception("You must Set an ObservableCollection");
              }
              _locations = (ObservableCollection<LocationViewModel>)value;
              RaisePropertyChanged(() => Locations);
          }
      }
      

      那么AddLocationOverlays 可以保持不变。

      唯一的问题是如果你想在这个集合上绑定到INotifyCollectionChanged - 但我认为如果需要你也可以找到解决这个问题的方法 - 例如您可以以某种方式公开另一个 INotifyCollectionChanged 挂钩,或者您可以尝试使用涉及中间类库的 hack。


      我接受现在这些是解决方法而不是解决方案:/

      【讨论】:

      • 至于将ObservableCollection 更改为IEnumerable 的代码示例在setter 中不起作用,因为您不能将IEnumerable 转换为ObservableCollection。您必须像这样从IEnumerable 创建一个新的ObservableCollectionnew ObservableCollection(ienum.ToList());
      • 要等一下,直到所有的问题都解决了。不过,我可能会在旁边玩 vNext 并报告我的发现。
      • 谢谢 - 演员表问题已修复(假设您从未从 UI 端设置这个 - 问题仍然存在!)。不用担心您的选择。感谢您的报告。
      猜你喜欢
      • 2014-04-08
      • 2011-07-11
      • 2013-09-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-16
      • 2014-08-15
      • 2016-05-01
      相关资源
      最近更新 更多