2

私がやりたいことの一部を達成するのに役立つこの質問を見つけました: MVVM-テキストボックスでテキストを選択するにはどうすればよいですか?

私の最初の問題は、それぞれに「すべて選択」ボタンが付いた2つのテキストボックスがあることですが、受け入れられた回答を調整して、それぞれを個別に制御できるようにする方法がわかりません。

また、それぞれに「選択したテキストをコピー」ボタンを追加したいと思います。

MVVMパターンに固執しながらこれを行うにはどうすればよいですか?

4

1 に答える 1

4

2 つのボタンを、異なるテキスト ボックスで作業を呼び出す異なるコマンドにバインドするか、commandParameters を使用して、どちらで作業するかを区別することができます。

AttachedProperty を作成するか、カスタム コントロールを作成することで、リンクされた投稿をフォローすることができます。基本的に行う必要があるのは、テキスト選択用のバインド可能なプロパティを作成することです。TextBox のプロパティ "SelectedText" は素晴らしいアイデアのように思えますが、WPF でバインドしようとすると、DependencyProperty ではないためエラーがスローされます。バインドするプロパティは、DependencyProperty である必要があります。

したがって、ブール値として IsTextSelected などを作成し、それが変更されると、AttachedProperty またはカスタム コントロールがそれを処理し、SelectAll() または SelectedText=Text; を実行します。

単一のアイテムを実行する場合は、AttachedProperty を提案しました。しかし、あなたはカスタムコントロールを求めました。これは、あるタイプのコントロールに複数の機能改善を行う場合に使用する必要があり、それらを別のタイプで再利用することはできません。

public class SmartTextBox : TextBox
{
    public static readonly DependencyProperty IsSelectedTextProperty = DependencyProperty.RegisterAttached("IsSelectedText",
        typeof(bool), typeof(SmartTextBox), new FrameworkPropertyMetadata(false, OnIsSelectedChanged));

    public bool IsSelectedText
    {
        get { return (bool)GetValue(IsSelectedTextProperty); }
        set { SetValue(IsSelectedTextProperty, value); }
    }

    private static void OnIsSelectedChanged(DependencyObject sender, DependencyPropertyChangedEventArgs e)
    {
        SmartTextBox textbox = sender as SmartTextBox;
        if ((bool)e.NewValue)
        {
            textbox.Focus();
            textbox.SelectAll();
        }
    }
}

使用法: ビューモデル

  • 注1setユーザーが行ったことを追跡せずに、いつでも強制できるように、値が同じかどうかについてIFを実行していません。
  • 注2 IsSelectedUsername、IsSelectedFilepathなどの複数のプロパティを作成し、これらをバインドします。各 SmartTextBox は 1 つにバインドされ、変化する 1 つを処理します。

    public bool IsSelectedText
    {
        get { return isSelectedText; }
        set
        {
            isSelectedText = value;
            RaisePropertyChanged("IsSelectedText");
        }
    }
    
    private void SelectAllExecute()
    {
        IsSelectedText = true;
    }
    

使用法: XAML

xmlns:custom="clr-namespace:xyz.View.Controls"

        <custom:SmartTextBox Text="{Binding Path=MyText}" 
                             IsSelectedText="{Binding Path=IsSelectedText}"/>

選択したテキストを取得するには、バインドできる新しい依存関係プロパティと、コントロールがそれを更新する手段をカスタム コントロールに追加する必要があります。選択したテキストを知る必要がある前に、ユーザーがボタンをクリックするなどの操作を行うことを期待しているため、選択が変更されるのではなく、コントロールがフォーカスを離れるタイミングを選択しました。

    public static readonly DependencyProperty SelectedText2Property = DependencyProperty.RegisterAttached("SelectedText2",
        typeof(string), typeof(SmartTextBox), new PropertyMetadata(""));

    public string SelectedText2
    {
        get { return (string)GetValue(SelectedText2Property); }
        set { SetValue(SelectedText2Property, value); }
    }

    protected override void OnLostFocus(RoutedEventArgs e)
    {
        SelectedText2 = this.SelectedText;
        base.OnLostFocus(e);
    }

XAML がバインドされました。

        <custom:SmartTextBox Text="{Binding Path=MyText}" 
                             SelectedText2="{Binding Path=TheSelectedText, Mode=OneWayToSource}"
                             IsSelectedText="{Binding Path=IsSelectedText}"/>

ViewModel にはダム プロパティがあります (OneWayToSource であるため、変更イベントを発生させる必要はありません)。

public string TheSelectedText { get; set; }

そして、あなたができる場所ならどこでも

Console.WriteLine(TheSelectedText);
于 2013-08-05T14:37:28.263 に答える