【问题标题】:WPF: Trim all textboxesWPF:修剪所有文本框
【发布时间】:2015-11-24 10:08:12
【问题描述】:

我最近有一个要求,即我的应用程序中的所有文本框在离开文本框时都应该自动修剪文本。我不能/不想通过向每个文本框添加转换器或事件,或者通过在我的视图模型中为每个绑定编写/重写属性来做到这一点。首先,它会非常混乱和重复,其次,我的许多文本框已经有了转换器,而且 afaik,如果不编写多转换器,就无法连接多个转换器。

由于您不能在每次击键时都应用修剪,因此修剪必须在取消焦点事件之后但在绑定到我的视图模型之前发生。

这样做的最佳方法是什么?编写我自己的文本框类?某种控制模板/触发器?我对这些选项不够熟悉,不知道哪条路径最简单。

我已经在 App.xaml 中为我的所有文本框设置了一个样式,当 IsReadOnly 设置为 true 时,这使得它们看起来像 IsEnabled=false,所以这可能会使事情复杂化。

【问题讨论】:

  • 当你想使用该值时为什么不修剪?
  • 如果我设计了整个系统,那将是一个不错的选择,但此应用程序会保存到其他应用程序使用的数据库中,假设字符串已被修剪。
  • 那么您可以在将值提交到数据库之前修剪该值。
  • 您可以使用附加属性。这将是重复的,但易于维护。编写自己的文本框控件也是一个好方法
  • Basti,许多文本框直接绑定到实体框架实体,然后保存到数据库中,所以我不需要“手动”处理它们,我想保留就是这样。

标签: c# wpf xaml textbox trim


【解决方案1】:

好的,我有一个很好的解决方案,这是我非常简单的解决方案:

我添加了我自己的控件,它继承自 TextBox,TrimmedTextBox。构造函数:

public TrimmedTextBox()
{
    InitializeComponent();
    LostFocus += TrimmedTextBox_LostFocus;
}

private void TrimmedTextBox_LostFocus(object sender, RoutedEventArgs e)
{
    Text = Text.Trim();
}

这是在绑定完成之前触发的,所以保存到我的属性中的实际上是修剪后的值。

当然,我还必须在 TargetType=TextBox 的所有样式中添加修改。

【讨论】:

    【解决方案2】:

    MVVM 方法是使用 Behaviors

    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;
        }
    }
    

    然后在您的 XAML 中:

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

    请注意,您需要在local XML 命名空间声明中替换Your.NamespaceYour.Assembly。另外,你需要add System.Windows.Interactivy to your project

    【讨论】:

    • 感谢您的回答,因为我已经将它与我的解决方案一起使用,我不会立即使用它,但我会调查一下!
    猜你喜欢
    • 2015-01-12
    • 1970-01-01
    • 2012-11-18
    • 1970-01-01
    • 1970-01-01
    • 2023-03-16
    • 1970-01-01
    • 2020-03-15
    • 1970-01-01
    相关资源
    最近更新 更多