RichTextBox и текст из базы данных

174
29 декабря 2018, 17:40

Как реализовать сохранение rtf текста в базу данных и выгрузку его же из бд при помощи RichTextBox или другого элемента. В проекте использую wpf, mvvm. Возможен ли binding?

Answer 1

Можно написать такое поведение:

public class Rtf : Behavior<RichTextBox>
{
    private bool editing = false;
    public string Text
    {
        get => (string)GetValue(TextProperty);
        set => SetValue(TextProperty, value);
    }
    public static readonly DependencyProperty TextProperty =
        DependencyProperty.Register(nameof(Text), typeof(string), typeof(Rtf),
            new FrameworkPropertyMetadata(null, FrameworkPropertyMetadataOptions.BindsTwoWayByDefault, TextPropertyChangedCallback));
    private static void TextPropertyChangedCallback(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
        var rtf = (Rtf)d;
        if (rtf.editing) return;
        if (rtf.AssociatedObject == null) return;
        if (!(e.NewValue is string rtfText)) return;
        var bytes = Encoding.UTF8.GetBytes(rtfText);
        using (var stream = new MemoryStream(bytes))
        {
            rtf.AssociatedObject.SelectAll();
            rtf.AssociatedObject.Selection.Load(stream, DataFormats.Rtf);
        }
    }
    protected override void OnAttached()
    {
        base.OnAttached();
        AssociatedObject.TextChanged += OnTextChanged;
    }
    protected override void OnDetaching()
    {
        AssociatedObject.TextChanged -= OnTextChanged;
        base.OnDetaching();
    }
    private void OnTextChanged(object sender, TextChangedEventArgs e)
    {
        var textRange = new TextRange(
            AssociatedObject.Document.ContentStart,
            AssociatedObject.Document.ContentEnd);
        using (var stream = new MemoryStream())
        {
            textRange.Save(stream, DataFormats.Rtf);
            editing = true;
            Text = Encoding.UTF8.GetString(stream.ToArray());
            editing = false;
        }
    }
}

Тогда привязка будет выглядеть так:

<RichTextBox>
    <i:Interaction.Behaviors>
        <b:Rtf Text="{Binding RtfText}"/>
    </i:Interaction.Behaviors>
</RichTextBox>

Значение свойства RtfText можете хранить в БД — там будет RTF-документ со всем форматированием

READ ALSO
Пользовательский textbox

Пользовательский textbox

Код ниже (c# vs2010 winforms net40) определяет пользовательский текстбокс со свойствами "только для чтения" и "скрытым курсором"

237
Как работать с мултитач на Unity?

Как работать с мултитач на Unity?

Например так: нажал на левую сторону экрана - вывелось "Hi", а на правую - "Bye"Когда обе нажал - "Good"

191
Получение значения Dictionary&lt;&gt; по индексу

Получение значения Dictionary<> по индексу

Как получить значение Dictionary<> по индексу

216