2012-06-07 21 views
0

我在我的Wpf應用程序中使用caliburn micro。當內容更多時,我想向下滾動文本框。我不想使用視圖的代碼來實現這個功能。我有谷歌它,並找到以下鏈接。如何使用caliburn.micro使用視圖模型在text_changed事件中執行TextBox.scrolltoend

Use view's code behind directly。雖然這可能是一種解決方法,但我對這種方法並不滿意,因爲我認爲這是糟糕做法的出發點。

我發現多了一個參考使用Rx (reactive extensions)

Reactive Extensions for .NET (Rx) in WPF - MVVM

我不知道如何在卡利微的情況下用它來實現類似的功能。

類似的問題被另一個stackoverflow成員here問了但是沒有滿意的答覆。

我必須做兩件事。

  1. 訂閱文本Changed事件
  2. 獲得從發送器參數的文本框對象(或以某種方式與文本框對象),並執行它

ScrollToEnd()方法我估計是可能的或者通過卡利微IHandleRx(Reactive extensions)。有人可以幫我實現這個功能嗎?

+0

如果你想遵循MVVM,你應該使用代碼隱藏。這是一個與視圖相關的操作,因此將邏輯與視圖放在一起是有意義的(XAML/Code-Behind)。這不是「業務邏輯」,因爲你是視圖模型類不應該關心誰在使用它。如果不是一個好的GUI,而是一個基於命令的消費者,爲什麼基於命令的消費者會關心滾動到TextBox/RichTextBox的末尾? –

回答

1

你看過使用IResult嗎?他們提供了一種方法來實現這一點,而無需將視圖和視圖模型結合在一起。

它們做廣告從文檔:

因爲協程的行動中發生的,我們爲您提供的 ActionExecutionContext構建UI相關IResult 實現有用的。這允許ViewModel以聲明方式聲明 說明它在控制視圖方面的意圖,而不具有對視圖的任何 引用或需要基於交互的單元測試。

用MediaElement和CM播放聲音的例子。 Playing a sound in Silverlight with MediaElement and Caliburn Micro

+0

非常好,非常感謝@Derek。這非常有效。 – Elangesh

0

像m-y在他的評論中說的,這實質上是一個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> 

現在,如果你有視圖 - 視圖模型互動,我認爲這是做到這一點的最佳方式。

相關問題