Привязка RichTextBox прерывается, когда текст изменяется или очищается вручную - PullRequest
0 голосов
/ 13 марта 2019

У меня есть RichTextBox, привязанный к строке.

Используя C #, я генерирую строку, которая записывает в него.

Но если я хочу вручную изменить текст, щелкнув по RichTextBox и удалив его клавишей Backspace, или нажатием Enter, чтобы создать новую строку, привязка обрывается, и я больше не могу программно писать в нее с Строка во второй раз.


XAML

<RichTextBox x:Name="rtbScriptView" 
             Margin="11,71,280,56" 
             Padding="10,10,10,48"
             FontSize="14" 
             Grid.ColumnSpan="1" 
             VerticalScrollBarVisibility="Auto" 
             RenderOptions.ClearTypeHint="Enabled"
             Style="{DynamicResource RichTextBoxStyle}">
    <FlowDocument>
        <Paragraph>
            <Run Text="{Binding ScriptView_Text, 
                                Mode=TwoWay, 
                                UpdateSourceTrigger=PropertyChanged}" />
        </Paragraph>
    </FlowDocument>
</RichTextBox>

Просмотр модели

private string _ScriptView_Text;
public string ScriptView_Text
{
    get { return _ScriptView_Text; }
    set
    {
        if (_ScriptView_Text == value)
        {
            return;
        }

        _ScriptView_Text = value;
        OnPropertyChanged("ScriptView_Text");
    }
}

C #

ViewModel vm = new ViewModel();
DataContext = vm;

// Display a string in the RichTextBox

vm.ScriptView_Text = "This is a test."; // <-- This won't work if text is manually modified

Ответы [ 2 ]

0 голосов
/ 13 марта 2019

Когда вы редактируете RichTextBox, вы изменяете элементы внутри элемента FlowDocument.Элемент, к которому вы привязали, вероятно, будет удален в какой-то момент во время этого редактирования.Взгляните на RichtTextBox.Document.Groups, чтобы увидеть, что происходит при редактировании RichTextBox.

Стандартный RichTextBox не очень хорошо поддерживает MVVM / Binding.Вы хотели бы иметь привязку к свойству Document, но это не поддерживается для RichTextBox по умолчанию.Вы могли бы посмотреть здесь .

Или расширить его самостоятельно, что-то вроде этого:

BindableRichTextBox class

public class BindableRichTextBox : RichTextBox
{
    public static readonly DependencyProperty DocumentProperty = DependencyProperty.Register(nameof(Document), typeof(FlowDocument), typeof(BindableRichTextBox), new FrameworkPropertyMetadata(null, OnDocumentChanged));

    public new FlowDocument Document
    {
        get => (FlowDocument)GetValue(DocumentProperty);
        set => SetValue(DocumentProperty, value);
    }

    public static void OnDocumentChanged(DependencyObject obj, DependencyPropertyChangedEventArgs args)
    {
        var rtb = (RichTextBox)obj;
        rtb.Document = args.NewValue != null ? (FlowDocument)args.NewValue : new FlowDocument();
    }   
}

XAML

<controls:BindableRichTextBox Document="{Binding YourFlowDocumentObject, Mode=OneWay}"/>

Затем вы можете получить строку из FlowDocument.

0 голосов
/ 13 марта 2019

Почему вы должны написать эту строку. Пожалуйста, удалите строку после проверки.

if (_ScriptView_Text == value)
{
   return;
}
...