3

フォーカスされているときにTextBoxをクリアするにはどうすればよいですか?これをMVVMの方法で実行したいと思います。意味がある場合-私のTextBoxコントロールには、ViewModelのいくつかのプロパティにバインドされたTextプロパティがあります。TextBoxは「50,30zł」のようなsthを表示します。ユーザーがテキストを選択して削除し、新しいテキストを書き込むのは不快なので、Texboxがフォーカスされているときに古いテキストをクリアしたいと思います。

4

3 に答える 3

9

独自の動作を記述したり、制御したりすることもできます。最初のものを説明しようとします:

まず、System.Windows.Interactivityアセンブリへの参照を追加する必要があります。

次に、クラス (動作となる) を作成し、それをSystem.Windows.Interactivity.Behavior< System.Windows.Controls.TextBox>から派生させます。ここで、テンプレート化された (ジェネリック型) パラメーターは、説明したように動作するコントロールです。

例えば:

class ClearOnFocusedBehavior : System.Windows.Interactivity.Behavior<System.Windows.Controls.TextBox>
{
    private readonly RoutedEventHandler _onGotFocusHandler = (o, e) =>
                                                        {
                                                            ((System.Windows.Controls.TextBox) o).Text =
                                                                string.Empty;
                                                        };

    protected override void OnAttached()
    {
        AssociatedObject.GotFocus += _onGotFocusHandler;
    }

    protected override void OnDetaching()
    {
        AssociatedObject.GotFocus -= _onGotFocusHandler;
    }
}

次に、xaml の親ウィンドウに次の参照宣言を配置します。

<Window x:Class="ManagementSolution.Views.UpdatePersonsWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity">
    //namespace with ur behaviors
    xmlns:behaviors="clr-namespace:ManagementSolution.Helper.Behaviours"
    //...
</Window>

最後に、適切な UI 要素 (この場合は TextBox) に動作を追加します。

<TextBox x:Name="PersonFirstNameTextBox"
             Grid.Column="1"
             Margin="5,0"
             HorizontalAlignment="Stretch"
             VerticalAlignment="Center"
             Style="{StaticResource TextBoxValidationStyle}"
             TextWrapping="Wrap"
             d:LayoutOverrides="Width, Height">
        //behavior added as the content
        <i:Interaction.Behaviors>   
            <behaviors:ClearOnFocusedBehavior /> 
        </i:Interaction.Behaviors>
        <TextBox.Text>
            <Binding Path="PersonFirstName"
                     UpdateSourceTrigger="PropertyChanged"
                     ValidatesOnDataErrors="True">
                <!--
                    <Binding.ValidationRules>
                    <rules:SingleWordNameValidationRule />
                    </Binding.ValidationRules>
                -->
            </Binding>
        </TextBox.Text>
    </TextBox>
于 2012-04-21T11:27:26.717 に答える
0

textBox1.Clear();

テキストボックスのコンテンツをクリアします

于 2013-07-25T06:52:20.703 に答える
0

@Dmitry Martovoi からの素晴らしい回答。

これは、(ブレンド動作ではなく) 添付プロパティを使用した同じソリューションです。アタッチされたビヘイビアーは XAML を単純化しますが、C# はそれほど単純ではありませんが、Blend ビヘイビアーはその反対です。

XAML:

TextBox に追加behaviors:MyTextBox.MyClearOnFocusedIfTextEqualsSearch="True"して、フォーカスを受け取り、含まれている場合にそれ自体を明確にしますSearch

<Window x:Class="MyApp.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525"
        xmlns:behaviors="clr-namespace:MyApp">
    <StackPanel Margin="10">
        <!-- GotFocus="TextBox_GotFocus" -->
        <TextBox x:Name="MyTextBox" 
                 behaviors:MyTextBox.MyClearOnFocusedIfTextEqualsSearch="True" 
                 HorizontalAlignment="Left" 
                 Text="Search" 
                 MinWidth="96" ></TextBox>  
    </StackPanel>
</Window>

および添付プロパティ:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;

namespace MyApp
{
    public class MyTextBox : DependencyObject
    {
        public static readonly DependencyProperty MyClearOnFocusedIfTextEqualsSearchProperty = DependencyProperty.RegisterAttached(
            "MyClearOnFocusedIfTextEqualsSearch",
            typeof (bool),
            typeof(MyTextBox),
            new PropertyMetadata(default(bool), PropertyChangedCallback));

        private static void PropertyChangedCallback(DependencyObject dependencyObject, DependencyPropertyChangedEventArgs dependencyPropertyChangedEventArgs)
        {
            var textBox = dependencyObject as TextBox;
            if (textBox != null)
            {
                if ((bool)dependencyPropertyChangedEventArgs.NewValue == true)
                {
                    textBox.GotFocus += textBox_GotFocus;
                }
            }
        }

        private static void textBox_GotFocus(object sender, RoutedEventArgs e)
        {
            var textBox = sender as TextBox;
            if (textBox != null)
            {
                if (textBox.Text.ToLower() == "search")
                {
                    textBox.Text = "";
                }
            }
        }

        public static void SetMyClearOnFocusedIfTextEqualsSearch(DependencyObject element, bool value)
        {
            element.SetValue(MyClearOnFocusedIfTextEqualsSearchProperty, value);
        }

        public static bool GetMyClearOnFocusedIfTextEqualsSearch(DependencyObject element)
        {
            return (bool)element.GetValue(MyClearOnFocusedIfTextEqualsSearchProperty);
        }
    }
}

この添付された動作を記述するのに数分かかりました。ReSharper には、これを行うための優れたマクロがありattachedPropertyます。入力すると、このコードのほとんどが入力されます。

于 2015-01-22T10:10:15.080 に答える