0

我正在尝试通过绑定自定义属性“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;
    }
}
4

2 回答 2

2

问题是,您实际上从未对分配给Selection. 您实际上需要使其成为选定的文本。

public string Selection
{
    get
    {
        return (string)base.GetValue(SelectionProperty);
    }
    set
    {
        base.SetValue(SelectionProperty, value);
        if(value != SelectedText)
            SelectedText = value;
    }
}
于 2015-09-11T06:34:29.900 回答
2

要使 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并且您不必明确指定它。

于 2015-09-11T06:34:55.173 回答