WPF MVVM – установка CaretPosition из ViewModel [закрыто]C#

Место общения программистов C#
Anonymous
WPF MVVM – установка CaretPosition из ViewModel [закрыто]

Сообщение Anonymous »

Я пытаюсь создать вывод последовательной консоли с помощью WPF и реализовал это с помощью MVVM. Я реализовал код и использую обработчик событий для полученных последовательных данных, получаю последовательный вывод и могу обновить пользовательский интерфейс (текстовое поле с форматированием) текстом, полученным через последовательную консоль.Я столкнулся с проблемой установки позиции курсора. По сути, я хочу переместить позицию курсора в конец текста, как только RichTextBox будет обновлен полученным текстом. В WinForms это очень просто. Однако в WPF при реализации с использованием MVVM я изо всех сил пытаюсь понять, как это сделать.
Я довольно много прочитал и поискал в Интернете, но у меня возникла проблема. трудное время.
Я попробовал установить свойство CaretPosition в файле XAML. И я попытался связать его со свойством в моей ViewModel. И я получаю следующую ошибку:

Код: Выделить всё

**A 'Binding' cannot be set on the 'CaretPosition' property of type 'RichTextBox'. A 'Binding' can only be set on a DependencyProperty of a DependencyObject.**
Судя по ошибке, я также прочитал о DependencyObject и DependencyProperty, но мне трудно уяснить это.
Мне хотелось бы получить несколько указателей или пример кода о том, как можно реализовать настройку позиции курсора элемента управления RichTextBox (или даже элемента управления TextBox) через ViewModel. Будем очень признательны за любую помощь.
ОБНОВЛЕНИЕ: Добавлен код для файлов cs и xaml. Код ниже работает без каких-либо ошибок. Я также добавил текстовое поле и элемент управления форматированного текстового поля, так как хотел опробовать оба, если бы любой из них было бы проще реализовать в коде, чтобы элемент управления переместился в конец обновленного текста (я удалил ' Привязка» к «CaretPosition», поскольку она не работает.)
Вот код для MainWindowViewModel.cs.

Код: Выделить всё

using System.ComponentModel;
using System.Windows.Input;

namespace RichTextBox_CaretPos
{
class MainWindowViewModel : INotifyPropertyChanged
{
private string? m_TextOutput = "";

public ICommand UpdateText { get; set; }

public string? TextOutput
{
get
{
return m_TextOutput;
}

set
{
m_TextOutput = value;
OnPropertyChanged(nameof(TextOutput));
}
}

#region INotifyPropertyChanged Members
public event PropertyChangedEventHandler? PropertyChanged;

private void OnPropertyChanged(string propertyName)
{
if (PropertyChanged != null)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
}
#endregion

public void UpdateTextObjects(object? parameters)
{
TextOutput = "Line 1\nLine 2\nLine 3\nLine 4\nLine 5\nLine 6\nLine 7\nLine 8\nLine 9\nLine 10\nLine 11\nLine 12\nLine 13\nLine 14\nLine 15\n----------\n";
}

public MainWindowViewModel()
{
UpdateText = new RelayCommand(UpdateTextObjects);

TextOutput = "Here we go...\n";
}
}

public class RelayCommand : ICommand
{
public event EventHandler? CanExecuteChanged;

private Action m_Execute;
private Predicate m_CanExecute;

public RelayCommand(Action execute) : this(execute, null)
{
}

public RelayCommand(Action execute, Predicate? canExecute)
{
m_Execute = execute;
m_CanExecute = canExecute;
}

public void Execute(object? parameter)
{
m_Execute(parameter);
}

public bool CanExecute(object? parameter)
{
if (m_CanExecute == null)
{
return true;
}

return m_CanExecute(parameter);
}

public void RaiseCanExecuteChanged()
{
if (CanExecuteChanged != null)
{
CanExecuteChanged(this, EventArgs.Empty);
}
}
}
}
Ниже приведен код MainWindow.xaml (MainWindow.xaml.cs остался нетронутым) НАБЛЮДАЕМОЕ ПОВЕДЕНИЕ:
При нажатии кнопки текст добавляется в элементы управления TextBox и RichTextBox. Однако текстовое поле не прокручивается до конца.
p.s. Я не эксперт по C#. На самом деле, я довольно новичок в этом. Итак, я действительно борюсь с этим. Я пробовал использовать/реализовать «Поведение», но это тоже не помогло.
Буду очень признателен за любую помощь.

Подробнее здесь: https://stackoverflow.com/questions/787 ... -viewmodel

Вернуться в «C#»