我最近要求我的应用程序中的所有文本框都应在离开文本框时自动修剪文本。我无法通过向每个文本框添加转换器或事件,或者通过在每个单独的绑定中编写/重写我的viewmodel中的属性来实现此目的。首先,它将非常混乱和重复,其次,我已经有许多文本框的转换器,而且,在没有编写多路转换器的情况下,您无法连接多个转换器。
由于您无法在每个键击时应用修剪,因此修剪必须在非聚焦事件之后但在对我的视图模型进行绑定操作之前进行。
这样做的最佳方式是什么?写我自己的文本框类?某种控制模板/触发器?我对这些选项不太熟悉,不知道哪条路径最简单。
我已经在App.xaml中为我的所有文本框设置了一个样式,当IsReadOnly设置为true时,它们看起来像IsEnabled = false,这样可能会使事情变得复杂。
答案 0 :(得分:2)
MVVM 方式将使用行为:
isPackageVisibility()
然后在你的XAML中:
using System.Windows.Controls;
using System.Windows.Interactivity;
public class TrimTextBoxBehavior : Behavior<TextBox>
{
protected override void OnAttached()
{
base.OnAttached();
AssociatedObject.LostFocus += AssociatedObject_LostFocus;
}
private void AssociatedObject_LostFocus(object sender, System.Windows.RoutedEventArgs e)
{
AssociatedObject.Text = AssociatedObject.Text.Trim();
}
protected override void OnDetaching()
{
base.OnDetaching();
AssociatedObject.LostFocus -= AssociatedObject_LostFocus;
}
}
请注意,您需要在<UserControl ...
xmlns:i="http://schemas.microsoft.com/expression/2010/interactivity"
xmlns:local="clr-namespace:Your.Namespace;assembly=Your.Assembly">
<TextBox>
<i:Interaction.Behaviors>
<local:TrimTextBoxBehavior />
</i:Interaction.Behaviors>
</TextBox>
XML命名空间声明中替换Your.Namespace
和Your.Assembly
。此外,您需要add System.Windows.Interactivy to your project。
答案 1 :(得分:1)
好的,我有一个很好的解决方案,这是我非常简单的解决方案:
我添加了自己的控件,它继承自TextBox,TrimmedTextBox。构造函数:
public TrimmedTextBox()
{
InitializeComponent();
LostFocus += TrimmedTextBox_LostFocus;
}
private void TrimmedTextBox_LostFocus(object sender, RoutedEventArgs e)
{
Text = Text.Trim();
}
这是在绑定完成任务之前触发的,因此保存到我的属性的内容实际上是修剪后的值。
我还必须在TargetType = TextBox的所有样式中添加修改。