簡體   English   中英

如何使用caliburn.micro和視圖模型在text_changed事件中執行TextBox.scrolltoend

[英]How to execute TextBox.scrolltoend in text_changed event using caliburn.micro using view model

我在Wpf應用程序中使用caliburn micro。 當內容更多時,我想向下滾動一個文本框。 我不想在后面使用View的代碼來實現此功能。 我在Google上找到了以下鏈接。

直接在后面使用view的代碼 盡管這可能是一種解決方法,但我對這種方法並不滿意,因為我認為這是不良做法的起點。

我發現了另一個參考,以使用Rx(反應性擴展)實現類似的功能

WPF-MVVM中.NET(Rx)的反應性擴展

我不知道如何在Caliburn Micro中使用它。

另一個stackoverflow成員在此處提出了類似的問題,但是沒有令人滿意的答復。

我必須做兩件事。

  1. 訂閱文本更改事件
  2. 從sender參數(或文本框對象)獲取Textbox對象,並執行其ScrollToEnd()方法

我猜這可能是由Caliburn micro的IHandleRx(Reactive extensions)造成的 有人可以幫我如何實現這一功能嗎?

您是否看過使用IResult? 它們提供了一種無需將視圖和視圖模型耦合在一起即可實現此目的的方法。

來自文檔的摘要:

由於協程發生在Action內部,因此我們為您提供了一個ActionExecutionContext,可用於構建與UI相關的IResult實現。 這使ViewModel可以聲明性地聲明其在控制視圖中的意圖,而無需引用View或進行基於交互的單元測試。

使用MediaElement和CM在SL中播放聲音的示例。 使用MediaElement和Caliburn Micro在Silverlight中播放聲音

就像我在他的評論中所說,這本質上是一個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交互功能,我認為這是最好的方法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM