Установить все связанные текстовые поля для обрезки - PullRequest
0 голосов
/ 16 июня 2019

Я создаю приложение WPF с использованием MVVM. Я бы хотел, чтобы все текстовые поля в приложении по умолчанию обрезали текст.

Я пытался следовать ответу здесь

Мне удалось добавить ссылку System.Windows.Interactivty через NuGet. Я создал UserControl в папке поведений и скопировал предоставленный код. Но Visual Studio не может найти подходящий метод для переопределения, и AssociatedObject не существует.

А в XAML он не любит <local:TrimTextBoxBehavior /> или xmlns:local="clr-namespace:StaffApp;assembly=mscorlib" или xmlns:local="clr-namespace:StaffApp.Behaviors;assembly=mscorlib"


Я попробовал другой метод обрезки всех установщиков связанных свойств в моей модели

например. public string MiddleNames { get => _middleNames; set => _middleNames = value.Trim(); }

Но я не фанат необходимости делать это для каждого свойства, и это вызывает проблемы, когда текстовое поле имеет значение null, как определено в моей форме XAML:

<Label Width="100" Content="Middle name(s)" />
<TextBox Text="{Binding Employee.MiddleNames, TargetNullValue=''}" />

Ответы [ 2 ]

1 голос
/ 16 июня 2019

Вам необходимо ValueConverter или прикрепленное поведение, которое вы применяете через Style ко всем TextBox элементам управления.Третьим вариантом будет расширение TextBox и переопределение TextBoxBase.OnTextChanged(TextChangedEventArgs).

TextTrimBehavior:

public class TextTrimBehavior : DependencyObject
{
  #region IsEnabled attached property

  public static readonly DependencyProperty IsEnabledProperty = DependencyProperty.RegisterAttached(
    "IsEnabled", typeof(bool), typeof(TextTrimBehavior), new PropertyMetadata(false, TextTrimBehavior.OnAttached));

  public static void SetIsEnabled(DependencyObject attachingElement, bool value)
  {
    attachingElement.SetValue(TextTrimBehavior.IsEnabledProperty, value);
  }

  public static bool GetIsEnabled(DependencyObject attachingElement)
  {
    return (bool) attachingElement.GetValue(TextTrimBehavior.IsEnabledProperty);
  }

  #endregion

  private static void OnAttached(DependencyObject d, DependencyPropertyChangedEventArgs e)
  {
    if (!(d is TextBox attachedTextBox))
    {
      return;
    }

    if ((bool) e.NewValue)
    {
      attachedTextBox.LostFocus += TextTrimBehavior.TrimText;
    }
    else
    {
      attachedTextBox.LostFocus -= TextTrimBehavior.TrimText;
    }
  }

  private static void TrimText(object sender, RoutedEventArgs e)
  {
    if (sender is TextBox textBox)
    {
      textBox.Text = textBox.Text.Trim();
    }
  }
}

TextBox Стиль:

<Style TargetType="TextBox">
    <Setter Property="behaviors:TextTrimBehavior.IsEnabled" 
            Value="True" /> 
</Style> 

Поскольку ключ Style не имеет ключа, он будет применяться неявно ко всем элементам управления TextBox в области действия.Чтобы сделать стиль глобальным, вы должны поместить его в App.xaml ResourceDictionary.

Расширение неявного стиля с помощью Style.BasedOn:

<Style x:Key="ExplicitStyle" TargetType="TextBox" 
       BasedOn="{StaticResource {x:Type TextBox}}">
    <Setter Property="Background"
            Value="YellowGreen" />
</Style>
1 голос
/ 16 июня 2019

Вы можете попробовать использовать конвертеры.Таким образом, вам просто нужно добавить конвертер в привязку текстового поля, и это будет сделано.

// Property in the View Model
public string Text { get;set; }

// Converter class
public class TrimTextConverter : IValueConverter {
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture) {
        if (!string.IsNullOrEmpty((string)value)) {
            return ((string)value).Trim();
        }
        return string.Empty;
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) {
        return value;
    }
}
<!--In the xaml file-->

<!--Reference to the converter namespace-->
xmlns:converter="clr-namespace:namespace-where-converter-is-located"

<!--Adding Converter To Resource Dictionary-->
<ResourceDictionary>
    <converter:TrimTextConverter x:Key="TrimTextConverter"/>
</ResourceDictionary>

<!--TextBox-->
<TextBox Grid.Row="4" Text="{Binding Text, Converter={StaticResource TrimTextConverter}">
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...