2012-06-07 22 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> 

现在,如果你有视图 - 视图模型互动,我认为这是做到这一点的最佳方式。

相关问题