フォーカスされているときにTextBoxをクリアするにはどうすればよいですか?これをMVVMの方法で実行したいと思います。意味がある場合-私のTextBoxコントロールには、ViewModelのいくつかのプロパティにバインドされたTextプロパティがあります。TextBoxは「50,30zł」のようなsthを表示します。ユーザーがテキストを選択して削除し、新しいテキストを書き込むのは不快なので、Texboxがフォーカスされているときに古いテキストをクリアしたいと思います。
3 に答える
独自の動作を記述したり、制御したりすることもできます。最初のものを説明しようとします:
まず、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>
textBox1.Clear();
テキストボックスのコンテンツをクリアします
@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
ます。入力すると、このコードのほとんどが入力されます。