如何使用视图模型使用caliburn.micro在text_changed事件中执行TextBox.scrolltoend

时间:2012-06-07 13:04:08

标签: c# wpf mvvm event-handling caliburn.micro

我在我的Wpf应用程序中使用了caliburn micro。当内容更多时,我想向下滚动一个文本框。我不想使用view的代码来实现这个功能。我有谷歌它,并找到以下链接。

Use view's code behind directly。虽然这可能是一种解决方法,但我对这种方法并不满意,因为我认为这是不良做法的起点。

我找到了另一个使用Rx (reactive extensions)

实现类似功能的参考

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

我不知道如何在Caliburn Micro的背景下使用它。

另一个stackoverflow成员here提出了类似问题,但没有令人满意的回复。

我必须做两件事。

  1. 订阅文字更改的活动
  2. 从sender参数获取Textbox对象(或以某种方式获取文本框对象)并执行它的ScrollToEnd()方法
  3. 我想可以通过Caliburn micro的IHandleRx(Reactive extensions)来实现。有人可以帮助我如何实现这个功能吗?

2 个答案:

答案 0 :(得分:1)

你看过使用过IResult吗?它们提供了一种实现此目的的方法,而无需将视图和视图模型耦合在一起。

来自文档的简介:

  

因为协同程序出现在Action内部,所以我们为您提供了一个   ActionExecutionContext在构建与UI相关的IResult时非常有用   实现。这允许ViewModel以声明方式进行   声明控制视图的意图没有任何意图   参考视图或基于交互的单元测试的需要。

使用MediaElement和CM在SL中播放声音的示例。 Playing a sound in Silverlight with MediaElement and Caliburn Micro

答案 1 :(得分:0)

就像m-y在他的评论中所说,这实际上是一个View操作而不是ViewModel。视图背后的代码并不是立即不好的做法。当操作需要依赖于View的依赖时,视图后面的代码才会很糟糕。

如果您不喜欢视图背后的代码,可以使用行为来实现:

  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交互,我认为这是最好的方法。