将RichTextBox的选定文本绑定到ViewModel中的属性

时间:2012-04-18 22:20:15

标签: wpf data-binding wpf-controls richtextbox flowdocument

您好我正在使用WPF并使用MVVM模式。所以我的问题是我试图将RichTextBox的选定文本绑定到我的ViewModel中的属性,但我无法绑定Selection属性。

那我该怎么做呢?

将RichTextBox的Selection属性绑定到ViewModel中的属性是我认为将效果和装饰应用于文本的方式。

如果有人知道在ViewModel中更好地了解RichTextBox的选定文本,请告诉我。我开始学习FlowDocuments并使用RichTextBox,这就是为什么我有点迷失。

提前致谢!

1 个答案:

答案 0 :(得分:2)

您可以使用Behavior

public class RichTextSelectionBehavior : Behavior<RichTextBox>
{
    protected override void OnAttached()
    {
        base.OnAttached();
        AssociatedObject.SelectionChanged += RichTextBoxSelectionChanged;
    }

    protected override void OnDetaching()
    {
        base.OnDetaching();
        AssociatedObject.SelectionChanged -= RichTextBoxSelectionChanged;
    }

    void RichTextBoxSelectionChanged(object sender, System.Windows.RoutedEventArgs e)
    {
        SelectedText = AssociatedObject.Selection.Text;
    }

    public string SelectedText
    {
        get { return (string)GetValue(SelectedTextProperty); }
        set { SetValue(SelectedTextProperty, value); }
    }

    public static readonly DependencyProperty SelectedTextProperty =
        DependencyProperty.Register(
            "SelectedText",
            typeof(string),
            typeof(RichTextSelectionBehavior),
            new FrameworkPropertyMetadata(null, FrameworkPropertyMetadataOptions.BindsTwoWayByDefault, OnSelectedTextChanged));

    private static void OnSelectedTextChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
    {
        var behavior = d as RichTextSelectionBehavior;
        if (behavior == null)
            return;
        behavior.AssociatedObject.Selection.Text = behavior.SelectedText;
    }
}

XAML用法:

    <RichTextBox>
        <i:Interaction.Behaviors>
            <local:RichTextSelectionBehavior SelectedText="{Binding SelectedText}" />
        </i:Interaction.Behaviors>
    </RichTextBox>

(其中SelectedText是ViewModel上的字符串属性)