0

Wpfアプリケーションでcaliburnmicroを使用しています。コンテンツが多い場合は、テキストボックスを下にスクロールしたいと思います。この機能を実現するために、ビューのコードビハインドを使用したくありません。私はそれをグーグルで検索し、次のリンクを見つけました。

ビューのコードビハインドを直接使用します。回避策かもしれませんが、これが悪い習慣の出発点であると考えるので、私はこのアプローチに満足していません。

Rx(リアクティブエクステンション)を使用して同様の機能を実現するためのもう1つのリファレンスを見つけました

WPFの.NET(Rx)のリアクティブ拡張機能-MVVM

CaliburnMicroのコンテキストでそれを使用する方法がわかりません。

ここで別のstackoverflowメンバーから同様の質問がありましたが、満足のいく回答はありませんでした。

私は2つのことをしなければなりません。

  1. 購読テキスト変更イベント
  2. 送信者パラメーター(または何らかの方法でテキストボックスオブジェクト)からTextboxオブジェクトを取得し、そのScrollToEnd()メソッドを実行します

IHandleCaliburn microまたはRx(Reactiveextensions)のいずれかで可能だと思います。この機能を実現する方法を教えてもらえますか?

4

2 に答える 2

1

IResult の使用を見たことがありますか? これらは、ビューとビューモデルを結合せずにこれを達成する方法を提供します。

ドキュメントからの宣伝文:

コルーチンは Action 内で発生するため、UI 関連の IResult 実装の構築に役立つ ActionExecutionContext を提供します。これにより、ViewModel は、View への参照や対話ベースの単体テストを必要とせずに、ビューを制御する意図を宣言的に述べることができます。

MediaElement と CM を使用して SL でサウンドを再生する例。 MediaElement と Caliburn Micro を使用して Silverlight でサウンドを再生する

于 2012-06-08T23:21:24.927 に答える
0

私が彼のコメントで言ったように、これは本質的に View 操作であり、ViewModel の操作ではありません。ビューの背後にあるコードは、すぐに悪い習慣ではありません。ビューの背後にあるコードは、操作がビューを超えた依存関係を必要とする場合にのみ悪いです。

ビューのコード ビハインドが気に入らない場合は、ビヘイビアーを使用してそれを行うことができます。

  public class TextBoxScrollToEndOnTextChanged:Behavior<TextBox>
  {
    protected override void OnAttached()
    {
      AssociatedObject.TextChanged += AssociatedObject_TextChanged;
    }

    protected override void OnDetaching()
    {
      AssociatedObject.TextChanged -= AssociatedObject_TextChanged;
    }

    void AssociatedObject_TextChanged(object sender, TextChangedEventArgs e)
    {
      AssociatedObject.ScrollToEnd();
    }
  }

xaml:

<TextBox>
    <i:Interaction.Behaviors>
        <behaviors:TextBoxScrollToEndOnTextChanged />
    </i:Interaction.Behaviors>
</TextBox>

View - ViewModel の相互作用がある場合、これが最善の方法だと思います。

于 2016-02-19T14:18:30.097 に答える