2017-03-17 8 views
-1

私は3Dレンダリングされたデータをユーザーに表示するカスタムコントロールを使用しています。コントロールには、コントロールの状態をデフォルトに戻すResetView()メソッドがあります。私はウィンドウのデータコンテキストであるビューモデルを持っているので、ボタンを同じビューでクリックしてMVVM構造を維持すると、コントロールのResetViewメソッドをどのように呼び出すのですか?WPFのコマンドでカスタムコントロールのメソッドを呼び出す方法

+1

'button.Click'と' control.ResetView() 'にはVMはまったく関係しません。コードビュー内のClickハンドラで 'control.ResetView()'を実行することができます。これは、内部ビュー操作であるためです。 – ASh

+0

第2の考えで、contolがVMにバインドされている場合、Vmはおそらく 'Reset'メソッドを持ち、button.Commandバインディングに' ResetCommand'を公開する必要があります – ASh

+0

ええ、私はボタンクリックが非MVVMであることを知っています – user3519506

答えて

0

私が通常使用する一つの可能​​なアプローチ:

は、あなたのビューモデルでIObservableタイプのプロパティを作成します。実際の の実装では、 リアクティブエクステンション(RX)のSubjectを使用できます。

public class ViewModel 
{ 
    private Subject<Unit> _resetRequest = new Subject<Unit>(); 

    public IObservable<Unit> ResetRequest 
    { 
     get { return _resetRequest; } 
    } 
} 

コントロールの動作を作成します。行動は あなたの財産に縛られ、観察可能なものを購読する必要があります。サブスクリプションのOnNextハンドラから コントロールのResetView()メソッドを呼び出します。 XAMLで

public class ResetViewBehavior : Behavior<YourControl> 
{ 
    private IDisposable _subscription; 

    public static readonly DependencyProperty RequestProperty = DependencyProperty.Register("Request", typeof(IObservable<Unit>), typeof(ResetViewBehavior), new PropertyMetadata(null, OnRequestChanged)); 

    public IObservable<Unit> Request 
    { 
     get { return (IObservable<Unit>)GetValue(RequestProperty); } 
     set { SetValue(RequestProperty, value); } 
    } 

    private static void OnRequestChanged(DependencyObject d, DependencyPropertyChangedEventArgs e) 
    { 
     ((ResetViewBehavior)d).Resubscribe(); 
    } 

    private void Resubscribe() 
    { 
     _subscription?.Dispose(); 
     _subscription = Request?.Subscribe(_ => AssociatedObject.ResetView()); 
    } 

    protected override void OnAttached() 
    { 
     Resubscribe(); 
    } 

    protected override void OnDetaching() 
    { 
     _subscription?.Dispose(); 
    } 

} 

<Window> 
     <YourControl> 
      <i:Interaction.Behaviors> 
       <b:ResetViewBehavior Request="{Binding ResetRequest}" /> 
      </i:Interaction.Behaviors> 
     </YourControl> 
    </Window> 

ビューをリセットしたいときにビューモデルから被写体のOnNextメソッドを呼び出します。

public class ViewModel 
{ 
    private Subject<Unit> _resetRequest = new Subject<Unit>(); 

    public IObservable<Unit> ResetRequest 
    { 
     get { return _resetRequest; } 
    } 

    private void ResetView() 
    { 
     _resetRequest.OnNext(new Unit()); 
    } 
} 

このアプローチでは、私はいつもMVVMで回避しようとするコードがありません。代わりに、再利用可能な振る舞いでロジックをカプセル化します。

Unit as IObservableパラメータではなく、他のクラスを使用すると、コントロールのメソッドにデータを渡すこともできます。

+0

多くのありがとう、私はそれを実装するために見ていきます。 – user3519506

関連する問題