双向SelectedText绑定使用继承的文本框

本文关键字:文本 继承 SelectedText 绑定 双向 | 更新日期: 2023-09-27 18:12:10

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

如果可能的话,我更喜欢基于继承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;
    }
}

双向SelectedText绑定使用继承的文本框

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

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

对于Binding更新源代码,如果您想将更改反映回代码,则必须指定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,并且您不必显式指定它。