1

私の問題は、MvvmCross は Xamarin Studio で機能しますか? で生まれました。. MvvmCross は Visual Studio で正常に動作します。ただし、ビルドサーバーが使用するXamarin Studioを使用して、これを企業に展開することが義務付けられています。Xamarin Studio のビルド中に System.Windows.Input.ICommand がコンパイラによって見つからないという問題に遭遇しました。ICommands は、MvvmCross 全体でユーザー コマンド (System.Windows.Input.ICommand を実装する MvxCommand) に非常に広く使用されているようです。次のコードを使用して、独自のバージョンの ICommand を作成しようとしました。

using System;

namespace Something.Common
{
    public interface ICommand
    {
        event EventHandler CanExecuteChanged;
        bool CanExecute(object parameter);
        void Execute(object parameter);
    }
}

すべて問題ありませんが、MvxCommand は System.Windows.Input.ICommand インターフェイスを実装しているため、まだ修正されていません。そこで、基本的に Stuart の MvxCommand からコピーされ、独自の ICommand (Something.Common.ICommand) を実装する独自のバージョン MvxCommandEx を作成しました。

見よ、それは構築されます。展開します。それは私をすべて興奮させました。しかし....うまくいきませんでした。UI 要素をカスタム ICommand にバインドした場所は、何もしません。コントロールの Click イベントからビュー モデルのコマンドへのバインドが、.axml レイアウト ファイルでバインドするか、ビューに組み込みの CreateBindingSet メソッドを使用するかに関係なく、もはや存在しないかのようです。

今...いくつかのことでこれを回避できます...たとえば、標準のAndroidボタンを使用し、組み込みのClickイベントからビューモデルのコマンドを手動で呼び出すと、次のようになります。

btnAddScope.Click += (o, i) => { _ViewModel.RequestAddScope.Execute(null); };

Xamarin が PCL サポートをリリースするまでの間、この方法で問題ありません。しかし、次のような構文を使用して古い方法でバインドされたアプリの別のセクションで MvxListView を使用しています。

lst.ItemClick = _ViewModel.RequestViewScope;

ここで、lst は MvxListView です。

ただし、lst.ItemClick は System.Windows.Input.ICommand を想定しており、私の ICommand はその名前空間にないため、これは機能しません。

スチュアートは、おそらくうまくいくと思われるこれについての説明を提供しました。ただし、実際に機能するように ICommand を実装できないのは馬鹿げていると感じています。私が間違っていることに光を当てることができます。

4

1 に答える 1

0

簡単な解決策は次のとおりです。

  • Xamarin バージョンの独自の実装を提供し、System.Windows.Input.ICommandこの実装を使用する
  • または、Mac 上に構築された mvvmcross バイナリを使用します。

私は最初をお勧めします。

Something.Common.ICommand コード abd を削除し、MyCommand クラスの実装をビューモデルと同じプロジェクト/アセンブリに配置すると、Windows と Mac の両方で正常にビルドおよび実行されるはずです。

于 2013-07-03T22:40:51.243 に答える