10

私はボタンを持っています

<Button 
      android:id="@+id/ButtonConnect"
      android:layout_width="match_parent"
      android:layout_height="wrap_content"
      android:text="Disconnect"
      local:MvxBind="{'Click':{'Path':'DisconnectCommand'}}" />

そして、私はそれのためのコマンドを持っています

public IMvxCommand DisconnectCommand
{
    get
    {
        return new MvxRelayCommand(this.GetService<IConnectionService>().Disconnect);
    }
}

次に、DisconnectCommandを使用して有効/無効にします

DisconnectCommand.CanExecute(this.GetService<IConnectionService>().UsbConnected);

しかし、それは明らかに間違っています(それは機能していません)、私はチェックをパラメータとして入れました、しかし通常私はします

DisconnectCommand.CanExecute = someBool;

しかし、設定するプロパティがないので、これをどのように行うのですか?

4

2 に答える 2

8

使用方法を理解するにはCanExecute、SilverlightまたはWPFを見てください-使用方法について説明しているブログがたくさんありますICommand-例:http ://weblogs.asp.net/nmarun/archive/2009/12/02/using -icommand-silverlight-4.aspxまたはhttp://blog.galasoft.ch/archive/2009/09/26/using-relaycommands-in-silverlight-and-wpf.aspx

例は次のようになります。

private MvxRelayCommand _disconnectCommand;
public IMvxCommand DisconnectCommand
{
    get
    {
        if (_disconnectCommand == null)
            _disconnectCommand = new MvxRelayCommand(this.GetService<IConnectionService>().Disconnect, item => this.IsItemConnected(item));
        return _disconnectCommand;
    }
}

private void SomeServiceNotificationHandler()
{
    _disconnectCommand.RaisePropertyChanged();
}

private bool IsItemConnected(object thing)
{
    return /* your code */;
}

ただし、小さな問題が1つあります。

CanExecuteすべてのプラットフォームのすべてのMvxBindingsで完全に実装されているわけではありません...一部のプラットフォームでは機能しますが、一部のプラットフォームでは機能しません。現在、どれが機能するかはわかりません。問題が発生した場合は、(GitHubの問題を介して)お知らせください。修正されます...


個人的に...私は使用する傾向がありませんCanExecute-代わりに別のブールプロパティを使用する傾向があり、それをコントロールで使用可能なプロパティにバインドします-たとえば、ほとんどのコントロールには、、、、などEnabledがありIsEnabledます。DisabledIsDisabled

私は一般的に、呼び出すよりもブール型プロパティを設定する方が簡単(そして読みやすい)だと思いますRaiseCanExecuteChanged

たとえば、次のようなものを使用します。

<Button 
  android:id="@+id/ButtonConnect"
  android:layout_width="match_parent"
  android:layout_height="wrap_content"
  android:text="Disconnect"
  local:MvxBind="{'Click':{'Path':'DisconnectCommand'},'Enabled':{'Path':'UsbConnected'}}" />

このアプローチには利点があると断言できます。これは、コマンドロジックをすべて1つのオブジェクトに保持し、内で発生する呼び出しCanExecuteを防ぐために使用できるためです。そのため、mvvmcrossバインディングのバグを見つけたら、それを修正してみてください。ExecuteRelayCommandCanExecute

于 2012-10-18T09:57:49.120 に答える
5

Stuartの回答をフォローアップするために、ICommand.CanExecuteAndroidとiOSのMvxバインディングをサポートするためのプロパティを公開するとともに、両方をサポートするのは簡単です。

これを行うには、通常のCanExecute()メソッドをプロパティに変換してから、関連付けられたプロパティのCanExecuteChanged呼び出しにハンドラーを追加します。RaisePropertyChangedその後RaiseCanExecuteChanged、通常どおりに使用すると、PropertyChangedイベントも発生します。

    ...

    // constructor
    public SomeClass()
    {

        DoSomethingCommand = new MvxCommand(OnDoSomething, () => CanDoSomething);
        DoSomethingCommand .CanExecuteChanged += (sender, args) => RaisePropertyChanged(() => CanDoSomething);
    }

    public bool CanDoSomething
    {
        get { ... }
    }

    ...
于 2013-08-23T17:45:00.153 に答える