私は3Dレンダリングされたデータをユーザーに表示するカスタムコントロールを使用しています。コントロールには、コントロールの状態をデフォルトに戻すResetView()メソッドがあります。私はウィンドウのデータコンテキストであるビューモデルを持っているので、ボタンを同じビューでクリックしてMVVM構造を維持すると、コントロールのResetViewメソッドをどのように呼び出すのですか?WPFのコマンドでカスタムコントロールのメソッドを呼び出す方法
-1
A
答えて
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
関連する問題
- 1. カスタムコントロールonpaintイベントを呼び出す方法
- 2. モーダルウィンドウからメインWPFウィンドウのメソッドを呼び出す方法は?
- 3. wpfでKeyEventArgsメソッドを呼び出す方法
- 4. WPFコマンド - ハンドラの呼び出し
- 5. C#WPF Comboboxをメソッドから呼び出す方法は?
- 6. C#でメソッド/呼び出しを別のメソッドから呼び出す方法は?
- 7. メソッドでスレッドを呼び出す方法
- 8. ボタンでメソッドを呼び出す方法
- 9. ログインページでメソッドを呼び出す方法
- 10. C#でメソッドを呼び出す方法
- 11. viewmodelからメソッドを呼び出すコマンド
- 12. 呼び出し方法はWPFで
- 13. UITextViewを呼び出す方法addTargetメソッドを呼び出す
- 14. いくつかのWPFユーザーコントロールの "隠し"メソッドを呼び出す方法
- 15. Clojure gen-classメソッドでスーパークラスのメソッドを呼び出す方法は?
- 16. メソッドC#で別のメソッドを呼び出す方法は?
- 17. メソッドを呼び出す方法
- 18. メソッドを一度呼び出す方法
- 19. メソッドを呼び出す方法は?
- 20. tick()メソッドを呼び出す方法
- 21. Javaメソッドを呼び出す方法
- 22. jQuery.sheet.SUM()メソッドの呼び出し方法は?
- 23. UWP:WinAPIメソッドの呼び出し方法
- 24. NUnitテストでWPFテキストボックスのセッターを呼び出す方法
- 25. WPF MVVMでウィンドウのLoadedイベントを呼び出す方法は?
- 26. 別のメソッドを呼び出すメソッドを取得する方法
- 27. MVVMパターンでカスタムコントロールまたはUserControlのメソッドを呼び出す適切な方法はありますか?
- 28. WPFがイベント経由でコマンドを呼び出す
- 29. MVCでWebAPIメソッドを呼び出してjsonオブジェクトを呼び出す方法
- 30. WPFカスタムコントロールのトリガーをビルドする方法
'button.Click'と' control.ResetView() 'にはVMはまったく関係しません。コードビュー内のClickハンドラで 'control.ResetView()'を実行することができます。これは、内部ビュー操作であるためです。 – ASh
第2の考えで、contolがVMにバインドされている場合、Vmはおそらく 'Reset'メソッドを持ち、button.Commandバインディングに' ResetCommand'を公開する必要があります – ASh
ええ、私はボタンクリックが非MVVMであることを知っています – user3519506