使用继承在 TextBox 上进行双向 SelectedText 绑定

Two-way SelectedText binding on TextBox using inheritance

我试图通过绑定自定义 属性 'Selected' 来用新值替换 TextBox 的 SelectedText。目前,通过绑定更新 Selected 不会更改实际的 SelectedText。我想我快到了;至少鼠标选择文本正在更新 Selected。

如果可能,我更喜欢基于从 TextBox 继承的解决方案。 谁能告诉我缺少什么吗?

class SelectionTextbox : TextBox
{
    public static readonly DependencyProperty SelectionProperty = DependencyProperty.Register("Selection", typeof(string), typeof(SelectionTextbox));

    public string Selection
    {
        get
        {
            return (string)base.GetValue(SelectionProperty);
        }
        set
        {
            base.SetValue(SelectionProperty, value);
        }
    }
    protected override void OnSelectionChanged(RoutedEventArgs e)
    {
        base.OnSelectionChanged(e);
        Selection = SelectedText;
    }
}

问题是,您实际上从未对分配给 Selection 的值执行任何操作。您需要实际使其成为选定的文本。

public string Selection
{
    get
    {
        return (string)base.GetValue(SelectionProperty);
    }
    set
    {
        base.SetValue(SelectionProperty, value);
        if(value != SelectedText)
            SelectedText = value;
    }
}

如果要将更改反映回代码,您必须指定 Mode=TwoWay 才能让绑定更新源代码。这可以通过两种方式完成:

Selection="{Binding Path=MyProperty, Mode=TwoWay}"

public static readonly DependencyProperty SelectionProperty = 
    DependencyProperty.Register("Selection",
        typeof(string),
        typeof(SelectionTextbox),
        new FrameworkPropertyMetadata(default(string), 
            FrameworkPropertyMetadataOptions.BindsTwoWayByDefault));

通过使用第二种方法,您可以完成对 Selection 的所有绑定 TwoWay,并且您不必明确指定它。