2017-01-23 4 views
0

ユーザー入力またはプログラム更新によってXamarin.Forms.ValueChangedEventArgsイベントが発生したかどうかを判断する効率的な方法はありますか?Xamarin.Forms - スライダのValueChangedイベントはどのように発生しましたか?

私はXAMLで作成されたスライダーを持っており、ユーザーがスライダーの値を変更した場合にのみイベントハンドラーのコードが実行されるようにする必要があります。

基本的に、私はXamarin.AndroidのSeekBar.ProgressChangedEventArgs.FromUserプロパティのXamarin.Formsに相当するものを探しています。

アイデア?ありがとう!

+0

プログラムの開始時に値を初期化していますか?多分それがイベントを起こしているものです。イベントハンドラの中にブレークポイントを配置し、コールスタックを調べて、変更がどこから来たのかを確認することができます。 –

+0

@ChrisDunaway私は意図的にスライダーの値をさまざまな点でプログラム的に変更していますが、イベントハンドラーでそれらを無視したいと思います。イベントハンドラは、スライダを手動でスライドさせてスライダを変更した場合にのみ応答する必要があります。 – Jonathan

+0

私が知る唯一の方法は、プログラムで変更する直前にboolを設定してから、イベントハンドラ内のboolをチェックすることです。 –

答えて

0

MVVMの主なポイントは、スライダがバインドするプロパティはスライダの位置を表す必要があります。あなたのビューモデルロジックコードの残りの部分については、スライダプロパティISスライダが関係しています。コントロール全体をサブクラス化して、その値が設定されている場所を特定するだけでは、コントロールを使用するコードでロジックがはるかに簡単になるためです。 MVVMは違うわけではありません。つまり、プロパティがコントロールプロパティと1対1の関係にある必要があるため、その種類のロジックをビューコントロールがバインドされたプロパティ内に配置すると、パターンが破損します。あなたの説明から

あなたはこのような何かしようとしているように聞こえる:

public int SliderPos 
{ 
    set 
    // ... etc ... 
} 

void ChangeSliderPosManually() 
{ 
    ManualChangeFunction(); 
    SliderPos = 100; 
} 

結果は同じである:

public int SliderPos 
{ 
    set 
    { 
     if (valueChangedManually()) // <-- magic function 
      ManualChangeFunction(); 
    } 
    // ... etc ... 
} 

void ChangeSliderPosManually() 
{ 
    SliderPos = 100; 
} 

をので、あなたの代わりにこれを実行する必要がある場合しかし、ロジックは代わりに呼び出しコードによって処理されます。いつでもSliderPosの値が自動的に変更され、ManualChangeFunctionを呼び出さなかった場合は、スライダコントロールによってトリガされている必要があることがわかります。

変更がスライダとコードの結果であることを実際に知る必要がある場合は、ビヘイビアをコントロール自体に追加して、ビューモデルレイヤに通知を戻すことは可能ですが、 10年ほどで私はMVVMを開発してきました。私はこれまで真の必要性を見たことが一度もないと思います。

関連する問題