Если кому еще актуально... Столкнулся с аналогичной проблемой. События окна Loaded, Initialized, ContextChanged не перехватываются. Нормально ловится событие ContentRendered. Можно забиндиться на него, и не нужно выводить строчку текста. Нужно дать имя TextBox'у :
<TextBox x:Name="LogBox" ...
Код для окна:
<i:Interaction.Triggers>
<i:EventTrigger EventName="ContentRendered">
<i:InvokeCommandAction Command="{Binding SetLogBoxCmd}" CommandParameter="{Binding ElementName=LogBox}"/>
</i:EventTrigger>
</i:Interaction.Triggers>
В ВМ параметр команды привести к TextBox, и можно юзать AppendText (обязательно в контексте текущего потока):
Application.Current.Dispatcher.Invoke(() => _logBox?.AppendText(message));
Имхо, это все равно костыль...
CodeBehind для автоматической прокрутки TextBox
private void TextBox_OnTextChanged(object sender, TextChangedEventArgs e)
{
if (!(sender is TextBox textBox)) return;
textBox.CaretIndex = textBox.Text.Length;
textBox.ScrollToEnd();
}
Полное описание TextBox в xaml
<TextBox x:Name="LogBox" TextChanged="TextBox_OnTextChanged" VerticalScrollBarVisibility="Auto" Text="{Binding LogText, Mode=OneWay}" AcceptsReturn="True" VerticalAlignment="Top" IsReadOnly="True" AutoWordSelection="True" TextWrapping="Wrap"/>
В принципе, биндинг на Text уже не нужен.