1

PCLモデルをビルドするようになりました。プラグインの作成には少し時間がかかりましたが、Android UIプロジェクトでは、ビルド時に2つのエラーが発生します。

最初のエラーは次のとおりです。

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

2番目のエラーは次のとおりです。

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からアセンブリを参照しました。System.Windows.DroidObservableCollection<>

エラーが発生する行:

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

1

更新:他の回答を参照してください。この問題の解決策があるようです。


これはこの問題に関連していると思います-MonoTouch/MonoDroidのポータブルクラスライブラリの強力なアセンブリ参照の問題

リンク先:https ://github.com/slodge/MvvmCross/issues/41

これは、Xamarinをバグとして使用して発生します:https ://bugzilla.xamarin.com/show_bug.cgi?id=8035および

現在、推奨される強力な署名ソリューションを理解していません。

これについてMicrosoftPCLおよびXamarinチームに警告するには、バグレポートに賛成してください。MSチームとXamarinチームはこれについて互いに話し合っています(私を通してですが!)。MicrosoftまたはXamarinのいずれかが署名付きDLLを出荷する方法が見つかることを願っています。


それまでの間、考えられる回避策は次のとおりです。

  1. ObservableCollectionの代わりにIEnumerableアクセスを使用します-コレクションは引き続き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 に答える