Wenn mit Wpf Bindung ist es eine Möglichkeit, System.String funcntions zu verwenden, ohne Konvertern?
-
21-08-2019 - |
Frage
Wenn Sie mit Wpf Bindung ist es eine Möglichkeit, System.String funcntions verwenden ohne Konverter mit ?
<TextBlock Text="({Binding Path=Text}).Trim()"/>
das ist im Grunde mein Wunsch.
Lösung
Ich möchte einen Konverter.
Die Bindung XAML
<StackPanel>
<StackPanel.Resources>
<local:StringTrimmingConverter x:Key="trimmingConverter" />
<StackPanel.Resources>
<TextBlock Text="{Binding Path=Text, Converter={StaticResource trimmingConverter}}" />
</StackPanel>
StringTrimmingConverter.cs
using System;
using System.Windows.Data;
namespace WpfApplication1
{
[ValueConversion(typeof(string), typeof(string))]
public class StringTrimmingConverter : IValueConverter
{
#region IValueConverter Members
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
return value.ToString().Trim();
}
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
return value;
}
#endregion
}
}
Und wenn VB StringTrimmingConverter.vb
Imports System.Globalization
Public Class StringTrimmingConverter
Implements IValueConverter
Public Function ConvertBack(ByVal value As Object, ByVal targetType As Type, ByVal parameter As Object, ByVal culture As CultureInfo) As Object Implements IValueConverter.ConvertBack
Return value.ToString().Trim
End Function
Public Function Convert(ByVal value As Object, ByVal targetType As Type, ByVal parameter As Object, ByVal culture As CultureInfo) As Object Implements IValueConverter.Convert
Return value
End Function
End Class
Andere Tipps
ich eine ultimative Konverter für alle Funktionen in System.String erstellt, benötigt würden einige Verbesserungen, von Ihnen zu hören lieben, hoffen, dass es in Zukunft zu aktualisieren, bitte akzeptieren:
VB:
<ValueConversion(GetType(String), GetType(Object))> _
Class StringFunctions : Implements IValueConverter
Public Function Convert(ByVal value As Object, ByVal targetType As System.Type, ByVal parameter As Object, ByVal culture As System.Globalization.CultureInfo) As Object Implements System.Windows.Data.IValueConverter.Convert
If parameter Is Nothing OrElse Not TypeOf parameter Is String OrElse String.IsNullOrEmpty(parameter) Then Return Nothing
Dim parameters As New List(Of String)(parameter.ToString.Split(":"c))
parameter = parameters(0)
parameters.RemoveAt(0)
If String.IsNullOrEmpty(parameter) Then Return value
Dim method = (From m In GetType(String).GetMethods _
Where m.Name = parameter _
AndAlso m.GetParameters.Count = parameters.Count).FirstOrDefault
If method Is Nothing Then Return value
Return method.Invoke(value, parameters.ToArray)
End Function
Public Function ConvertBack(ByVal value As Object, ByVal targetType As System.Type, ByVal parameter As Object, ByVal culture As System.Globalization.CultureInfo) As Object Implements System.Windows.Data.IValueConverter.ConvertBack
Return value.ToString()
End Function
End Class
C #: konvertiertem durch ein Werkzeug, verlassen Sie sich nicht
[ValueConversion(typeof(string), typeof(object))]
public class StringConverter : IValueConverter
{
#region IValueConverter Members
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
if (value == null) return null;
value = value.ToString();
if (String.IsNullOrEmpty(value as string)) return "";
if (parameter == null || !parameter is string || String.IsNullOrEmpty((string)parameter)) return value;
List<string> parameters = new List<string>(((string)parameter).Split(':'));
parameter = parameters[0];
parameters.RemoveAt(0);
var method = (from m in typeof(String).GetMethods()
where m.Name== parameter
&& m.GetParameters().Count()==parameters.Count
select m).FirstOrDefault();
if (method == null) return value;
return method.Invoke(value, parameters.ToArray());
}
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
return value;
}
#endregion
}
XAML:
<TextBox Text="{Binding Path=String, Converter={StaticResource StringConverter}, ConverterParameter=Trim:Argument:AnotherArgument}" />
Dann wird in der Bindung, wenn u einen Konverter verwenden u eine Option einen Parameter an den Konverter übergeben (Binding.ConverterParameter) passieren alle Parameter getrennt mit: (Doppelpunkt - Sie können es im String.Split Trennzeichen ändern Parameter), während der erste Parameter der Name der Funktion ist, wird die Funktion die zusätzlichen Parameter zählen und versuchen, es zu übergeben.
Ich habe immer noch nicht auf die Parameter-Adressierung, es ist eine flache Funktion.
Möchten Sie Ihre Verbesserungen und Hinweise sehen.
Vielen Dank.
Shimmy
Sie benötigen einen Konverter verwenden, wie Sie die Daten Ihrer Kontrolle verwandeln wollen, ist gebunden. Um zu vermeiden, viele Wandler einfacher Transformationen schreiben, können Sie die Dynamic Language Runtime verwenden und Ausdrücke in Ihrer Liebling DLR-Skriptsprache (wie Python, Ruby, etc.) schreiben.
Siehe meine Blog-Serie für ein Beispiel dafür, wie dies zu erreichen. Teil 3 spricht speziell über ValueConverters.
ich eine ultimative Konverter für alle Funktionen in System.String erstellt, benötigt würden einige Verbesserungen, von Ihnen zu hören lieben, hoffen, dass es in Zukunft zu aktualisieren, bitte akzeptieren:
<ValueConversion(GetType(String), GetType(String))> _
Class StringFunctions : Implements IValueConverter
Public Function Convert(ByVal value As Object, ByVal targetType As System.Type, ByVal parameter As Object, ByVal culture As System.Globalization.CultureInfo) As Object Implements System.Windows.Data.IValueConverter.Convert
If parameter Is Nothing OrElse Not TypeOf parameter Is String OrElse String.IsNullOrEmpty(parameter) Then Return Nothing
Dim parameters As New List(Of String)(parameter.ToString.Split(":"c))
parameter = parameters(0)
parameters.RemoveAt(0)
If String.IsNullOrEmpty(parameter) Then Return value
Dim method = (From m In GetType(String).GetMethods _
Where m.Name = parameter _
AndAlso m.GetParameters.Count = parameters.Count).FirstOrDefault
If method Is Nothing Then Return value
Return method.Invoke(value, parameters.ToArray)
End Function
Public Function ConvertBack(ByVal value As Object, ByVal targetType As System.Type, ByVal parameter As Object, ByVal culture As System.Globalization.CultureInfo) As Object Implements System.Windows.Data.IValueConverter.ConvertBack
Throw New NotSupportedException
End Function
End Class
Die in der Bindung, wenn u einen Konverter verwenden u eine Option einen Parameter an den Konverter übergeben (Binding.ConverterParameter) passieren alle Parameter getrennt mit: (Doppelpunkt - Sie können es im String.Split Begrenzer Parameter ändern können ), während der erste Parameter der Name der Funktion ist, wird die Funktion die zusätzlichen Parameter zählen und versuchen, es zu übergeben.
Ich habe immer noch nicht auf die Parameter-Adressierung, es ist eine flache Funktion.
Möchten Sie Ihre Verbesserungen und Hinweise sehen.
Vielen Dank.
Shimmy
Ich weiß, dass dieser Beitrag ist alt, aber es ist immer noch die erste zeigt, wenn „WPF TextBox Binding Trim“ gesucht.
Ich habe keine VB Antwort, aber bitte nicht in einen Konverter.
Begründung:
- A-Wandler bedeutet, dass Sie zusätzliche XAML-Code, um alle Ihre XAML Bindung jedes Mal hinzuzufügen haben. genauso schlimm ist in XAML, wie es in C # / VB immer fügen Sie zusätzlichen Code.
- Das wird verhindern, dass Sie ein Leerzeichen eingeben, wenn Sie Update = gesetzt Property.
Mit der objektorientierten Programmierung, wie es soll, verwendet werden. Wenn Sie eine getrimmte TextBox benötigen, dann ein Kind von TextBox namens TrimmedTextBox erstellen und verwenden. http://www.wpfsharp.com/2014/ 15.05 / a-simple-trimmedtextbox-for-wpf /
C #
using System.Windows.Controls;
namespace WpfSharp.UserControls
{
public class TrimmedTextBox : TextBox
{
public TrimmedTextBox()
{
LostFocus += TrimOnLostFocus;
}
void TrimOnLostFocus(object sender, System.Windows.RoutedEventArgs e)
{
var trimTextBox = sender as TrimmedTextBox;
if (trimTextBox != null)
trimTextBox.Text = trimTextBox.Text.Trim();
}
}
}
VB (I verwendet, um einen Konverter auf meiner C # -Code)
Imports System.Windows.Controls
Namespace WpfSharp.UserControls
Public Class TrimmedTextBox
Inherits TextBox
Public Sub New()
AddHandler LostFocus, AddressOf TrimOnLostFocus
End Sub
Private Sub TrimOnLostFocus(sender As Object, e As System.Windows.RoutedEventArgs)
Dim trimTextBox = TryCast(sender, TrimmedTextBox)
If trimTextBox IsNot Nothing Then
trimTextBox.Text = trimTextBox.Text.Trim()
End If
End Sub
End Class
End Namespace
Hoffe, das hilft. Fühlen Sie sich bitte frei, dieses Objekt zu verwenden, als ob es öffentlich zugänglich waren.