2012-04-21 11 views
2

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

答えて

7

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

まず、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; 
    } 
} 

次は、最後に、適切なUIエレメント(私たちの場合はテキストボックス)に動作を追加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> 

をあなたの親ウィンドウで、次の参照宣言を置きます:

<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> 
+0

素晴らしいソリューション!私は以前は行動を使用していませんでした。どうも! – Arvangen

0

textBox1.Clear();

それはテキストボックスにコンテンツ@Dmitry Martovoiから

+0

別の方法はtextBox1 = ""; –

0

グレート答えをクリアします。

これは、(ブレンド動作ではなく)添付プロパティを使用する同じソリューションです。結合された振る舞いによって、単純なXAMLが作成されますが、単純なC#ではなく、ブレンドの振る舞いは逆です。

XAML:

は、それがフォーカスを受け取った場合、それ自体それを明確にするためにテキストボックスに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); 
     } 
    } 
} 

それは、この添付振る舞いを記述するために私に数分かかりました。あなたがattachedPropertyと入力すると、ReSharperはこれを行うのに最適なマクロを持っています。このコードのほとんどはあなたのために記入されます。

関連する問題