gpt4 book ai didi

c# - 将所有绑定(bind)的文本框设置为修剪

转载 作者:行者123 更新时间:2023-12-03 10:22:14 24 4
gpt4 key购买 nike

这个问题在这里已经有了答案:





Clear whitespace from end of string in WPF/XAML

(2 个回答)


5个月前关闭。




我正在使用 MVVM 创建一个 WPF 应用程序。我想让应用程序中的所有文本框默认修剪文本。

我试图按照答案 here

我设法通过 NuGet 添加了 System.Windows.Interactivty 引用。我在行为文件夹中创建了一个 UserControl 并复制了提供的代码。但是 Visual Studio 找不到合适的方法来覆盖,并且 AssociatedObject 不存在。

而在 XAML 中,它不喜欢 <local:TrimTextBoxBehavior />xmlns:local="clr-namespace:StaffApp;assembly=mscorlib"xmlns:local="clr-namespace:StaffApp.Behaviors;assembly=mscorlib"
我尝试了一种不同的方法来修剪模型中所有绑定(bind)属性的 setter

例如public string MiddleNames { get => _middleNames; set => _middleNames = value.Trim(); }
但我不喜欢对每个属性都这样做,当文本框为我的 XAML 表单中定义的 null 时,这会导致问题:

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

最佳答案

您需要一个 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="TextTrimBehavior.IsEnabled"
Value="True" />
</Style>

由于 Style没有 key ,它将隐式应用于所有 TextBox控制范围内。要使样式全局化,您必须将其放入 App.xaml ResourceDictionary .

使用 Style.BasedOn 扩展隐式样式:
<Style x:Key="ExplicitStyle" TargetType="TextBox" 
BasedOn="{StaticResource {x:Type TextBox}}">
<Setter Property="Background"
Value="YellowGreen" />
</Style>

或者,您可以在本地设置附加属性
<TextBox TextTrimBehavior.IsEnabled="True" 
Text="{Binding Employee.MiddleNames, TargetNullValue=''}" />

关于c# - 将所有绑定(bind)的文本框设置为修剪,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56619808/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com