从View Model类中调用RichTextBox.ScrollToEnd()

时间:2011-02-10 16:54:25

标签: wpf mvvm richtextbox scroll caliburn.micro

您好我尝试解决这个问题,在WPF中我使用Caliburn Micro框架。在View中我有可绑定的richtextbox控件,我从视图模型类属性类型FlowDocument绑定。

我需要一种方法如何在视图中调用richetextbox控件上的方法ScrollToEnd。

有可能吗?因为在视图模型类中我没有richtextbox的实例。

感谢idead。

3 个答案:

答案 0 :(得分:1)

这里提出一个类似的问题并提出解决方案。 http://social.msdn.microsoft.com/Forums/en/wpf/thread/67b618aa-f62e-43f8-966c-48057f4d4e0c

答案 1 :(得分:1)

有时从代码隐藏文件调用UI代码是有意义的(如果其他解决方案使事情变得复杂)。请记住:模式只是建议而不是脚本。人们甚至可以争辩说,从视图模型中暴露FlowDocument会使视图模型对UI有所了解。但你这样做是因为它更容易,对吧?

如果你不想从后面的代码进行这个调用,这里有两个选项:

  • 考虑使用一个ScrollToEnd()方法向视图模型注入接口。 View实现了这种方法,只要感觉有必要,视图模型就会调用它。
  • 从视图模型ScrollToEndRequested中公开事件。 View会订阅此事件,并在触发时相应地执行操作。

其他选项(如附加行为)可能更合适,但它们实际上取决于您的上下文。

答案 2 :(得分:0)

我提供了一个关于使用Caliburns IResult here将焦点设置为特定控件的问题的答案。您应该能够使用相同的概念来获取RichTextBox以调用ScrollToEnd。我不会在这里复制完整的解释,转到那个问题的想法,但是下面的IResult实现(作为指导)应该让你走上正确的轨道。

public class RichTextBoxScrollToEnd : ResultBase
{
    public RichTextBoxScrollToEnd()
    {

    }

    public override void Execute(ActionExecutionContext context)
    {
        var view = context.View as UserControl;

        List<Control> richTextBoxes =
            view.GetChildrenByType<Control>(c => c is RichTextBox);

        var richTextBox = richTextBoxes.FirstOrDefault();

        if (richTextBox != null)
            richTextBox.Dispatcher.BeginInvoke(() =>
        {
            richTextBox.ScrollToEnd();
        });

        RaiseCompletedEvent();
    }
}

如果视图中有多个RichTextBoxes,则可以为RichTextBoxScrollToEnd的构造函数提供一个参数,该参数是您要定位的特定控件的名称,然后使用该名称过滤richTextBoxes,即< / p>

var richTextBox = richTextBoxes.FirstOrDefault(c => c.Name == _nameOfControl);

请参阅引用的问题以获取更多详细信息。