Wenn mit Wpf Bindung ist es eine Möglichkeit, System.String funcntions zu verwenden, ohne Konvertern?

StackOverflow https://stackoverflow.com/questions/670573

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.

War es hilfreich?

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:

  1. 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.
  2. 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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top