• Как обратиться к контролу из VM?

    @Samael7777
    Если кому еще актуально... Столкнулся с аналогичной проблемой. События окна 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 уже не нужен.
    Ответ написан
    Комментировать