Вызов RichTextBox.ScrollToEnd() из класса View Model

Привет, я пытаюсь решить эту проблему, в WPF я использую Caliburn Micro framework. В представлении у меня есть привязываемый элемент управления richtextbox, я привязываю тип свойства класса модели представления FlowDocument.

Мне нужен способ, как я могу вызвать метод ScrollToEnd для элемента управления richetextbox в поле зрения.

Является ли это возможным? Потому что в классе модели представления у меня нет экземпляра richtextbox.

Благодарю за идею.


person Community    schedule 10.02.2011    source источник


Ответы (3)


Аналогичный вопрос задается здесь с решением. http://social.msdn.microsoft.com/Forums/en/wpf/thread/67b618aa-f62e-43f8-966c-48057f4d4e0c

person JLaanstra    schedule 10.02.2011

Иногда имеет смысл вызывать код пользовательского интерфейса из файла кода (если другие решения усложняют ситуацию). Помните: шаблоны — это просто рекомендации, а не сценарий. Можно даже утверждать, что раскрытие модели представления FlowDocument from делает модель представления слишком осведомленной о пользовательском интерфейсе. Но ты сделал это, потому что так было проще, верно?

Если вы не хотите делать этот вызов из кода, есть два варианта:

  • Рассмотрите возможность внедрения интерфейса в модель представления с помощью одного метода ScrollToEnd(). Представление реализует этот метод, и модель представления вызывает его всякий раз, когда считает необходимым.
  • Предоставьте событие из модели представления ScrollToEndRequested. View подписывается на это событие и действует соответствующим образом всякий раз, когда оно запускается.

Другие варианты (например, привязанное поведение) могут быть более подходящими, но они действительно зависят от вашего контекста.

person Anvaka    schedule 10.02.2011
comment
Спасибо за отзыв, решение может быть подписано TextChanged в коде за пользовательским контролем, и если текст изменился, а пользователь не прокручивает RichTextBox, только класс ScrollToEnd. Это первое большое WPF-приложение mz, я использую микрофреймворк caliburn, может быть, вы его знаете. Поэтому я пытаюсь реализовать строгий дизайн MVVM, но для меня это пока невозможно. Я смотрю твой профиль, ты из Украины? Я из Словакии. - person ; 10.02.2011

Я дал ответ на вопрос о настройке фокуса на определенный элемент управления с помощью Caliburns IResult здесь. Вы должны быть в состоянии использовать ту же концепцию, чтобы завладеть 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, который является именем конкретного элемента управления, на который вы хотите настроить таргетинг, а затем отфильтровать richTextBox, используя это имя, т.е.

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

См. упомянутый вопрос для получения более подробной информации.

person Simon Fox    schedule 11.02.2011