0

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

直接使用view后面的代码。尽管这可能是一种解决方法,但我对这种方法并不满意,因为我认为这是不良做法的起点。

我发现了另一个使用Rx(反应式扩展)实现类似功能的参考

WPF 中 .NET (Rx) 的响应式扩展 - MVVM

我不知道如何在 Caliburn Micro 的上下文中使用它。

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

我必须做两件事。

  1. 订阅文本更改事件
  2. 从 sender 参数(或以某种方式获取文本框对象)获取文本框对象并执行ScrollToEnd()它的方法

我想可以通过IHandleCaliburn micro 或Rx(Reactive extensions)来实现。有人可以帮助我如何实现此功能吗?

4

2 回答 2

1

你看过使用 IResult 吗?它们提供了一种无需将视图和视图模型耦合在一起即可完成此任务的方法。

来自文档的简介:

因为协程发生在 Action 内部,我们为您提供了一个 ActionExecutionContext,可用于构建与 UI 相关的 IResult 实现。这允许 ViewModel 以声明方式声明其控制视图的意图,而无需对视图的任何引用或基于交互的单元测试。

使用 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();
    }
  }

xml:

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

现在,如果您有 View - ViewModel 交互,我认为这是最好的方法。

于 2016-02-19T14:18:30.097 回答