1

我现在要构建我的 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.WindowsSystem.Windows.Droid项目中引用了程序集,它应该是 forward ObservableCollection<>

发生错误的行:

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 模型中工作正常......

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

4

2 回答 2

2

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

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

于 2012-11-22T08:28:52.977 回答
1

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


我相信这与这个问题有关——Portable Class Library strong assembly reference questions 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 钩子,或者你可以尝试使用涉及中间类库。


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

于 2012-11-02T15:46:45.490 回答