您好我尝试解决这个问题,在WPF中我使用Caliburn Micro框架。在View中我有可绑定的richtextbox控件,我从视图模型类属性类型FlowDocument绑定。
我需要一种方法如何在视图中调用richetextbox控件上的方法ScrollToEnd。
有可能吗?因为在视图模型类中我没有richtextbox的实例。
感谢idead。
答案 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);
请参阅引用的问题以获取更多详细信息。