我在我的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提出了类似问题,但没有令人满意的回复。
我必须做两件事。
ScrollToEnd()
方法我想可以通过Caliburn micro的IHandle
或Rx(Reactive extensions)来实现。有人可以帮助我如何实现这个功能吗?
答案 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交互,我认为这是最好的方法。