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変更をコードに反映するかどうかを指定する必要があります。これには、次の 2 つの方法があります。

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

またはによって

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

2 番目の方法を使用すると、すべてのバインドSelectionが完了TwoWayし、明示的に指定する必要がなくなります。

于 2015-09-11T06:34:55.173 に答える