2009-03-22 2 views
1

Bei der Bindung mit Wpf gibt es eine Möglichkeit, System.String Funktionen ohne Verwendung von Konvertern zu verwenden?Bei der Bindung mit Wpf gibt es eine Möglichkeit, System.String-Funktionen zu verwenden, ohne Konverter zu verwenden?

<TextBlock Text="({Binding Path=Text}).Trim()"/> 

das ist im Grunde mein Wunsch.

+1

Ich habe gerade festgestellt, dass mein Beitrag in C# ist. Sie rufen Trim ohne Klammern auf, verwenden Sie VB? Wenn ja, fügen Sie ein Tag für VB hinzu und ich kann mein Beispiel aktualisieren. – bendewey

+0

Bitte stellen Sie in Zukunft sicher, dass die Angaben in der Frage eindeutig angegeben sind, nicht nur im Titel. – bendewey

+0

Ich werde, danke. Ich arbeite mit VB & C#, aber dieser Beitrag war in der Tat VB, da nur VB Aufrufmethoden ohne Klammern unterstützt. – Shimmy

Antwort

7

Ich würde einen Konverter verwenden.

XAML Bindung

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

Ich sagte, dass ich keine Milion-Konverter haben möchte, daher stellte ich die Frage, ich begann, mich um einen ultimativen String-Converter zu kümmern, schau mal, sag deine Meinung darüber, auf der Suche nach Verbesserungen (insbesondere Parameteradressierung). Vielen Dank trotzdem! – Shimmy

+0

Ich weiß nicht, warum die Leute so große Angst haben, eine Million Konverter zu haben. leg sie einfach in einen Ordner und sorge dafür, dass sie gut benannt sind. Es passt genau zum Grundsatz der einheitlichen Verantwortung (Single Responsibility Principle, SRP). – bendewey

+0

Ich donno, ich persönlich hasse es, nicht nur, aber ich habe alle meine Konverter in einem Namespace 'Konverter' und sie sind alle in der gleichen Datei. mit der heutigen VS-Navigation habe ich keine Probleme. trotzdem, danke für deinen Beitrag. – Shimmy

0

ich eine ultimative Konverter für alle Funktionen in System.String erstellt, würden einige Verbesserungen benötigt, von Ihnen zu hören, 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 verwendet Ein Konverter hat eine Option, um einen Parameter an den Konverter zu übergeben (Binding.ConverterParameter) Übergeben Sie alle Ihre Parameter getrennt mit: (Doppelpunkt - Sie können es im String.Split delimiter Parameter ändern), während der erste Parameter der Funktionsname ist, Die Funktion zählt die zusätzlichen Parameter und versucht sie zu übergeben.
Ich habe noch nicht an den Parametern Adressierung gearbeitet, es ist eine flache Funktion.

Möchten Ihre Verbesserungen und Notizen sehen.
danke. Shimmy

+0

Whoa! Verwenden Sie die Code-Funktion im Editor, um den Code formatiert zu halten. Funktioniert am besten, wenn Sie den Code einfügen und dann die Taste drücken. –

+0

Sorry, ich sah es, es ist jetzt formatiert :) – Shimmy

+0

Ich würde vorschlagen, dies zu generalisieren, um eine Methode für jeden Objekttyp aufzurufen. Es gibt nichts Besonderes an der Verwendung von String.Tatsächlich ist das Attribut "[ValueConversion (typeof (string), typeof (string))]" für einen aufzurufenden Aufruf bereits falsch, da es keinen String zurückgibt! –

0

Sie müssen einen Konverter verwenden, um die Daten zu transformieren, an die Ihre Kontrolle gebunden ist. Um zu vermeiden, dass viele einfache Transformationen von Konvertern geschrieben werden, können Sie die Dynamic Language Runtime verwenden und Ausdrücke in Ihrer bevorzugten DLR-Skriptsprache (wie Python, Ruby usw.) schreiben.

Ein Beispiel dafür, wie dies erreicht wird, finden Sie unter my blog series. Part 3 spricht speziell über ValueConverter.

1

ich eine ultimative Konverter für alle Funktionen in System.String erstellt, würden einige Verbesserungen benötigt, von Ihnen zu hören, 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#: -durch ein Werkzeug umgewandelt, nicht verlassen!

[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 ein Konverter u eine Option verwenden, um einen Parameter zu dem Wandler passieren (zu binden.ConverterParameter) übergeben Sie alle Ihre Parameter getrennt mit: (Doppelpunkt - Sie können es im Parameter String.Split delimiter ändern), während der erste Parameter der Funktionsname ist, zählt die Funktion die zusätzlichen Parameter und versuchen, sie zu übergeben.
Ich habe noch nicht an den Parametern Adressierung gearbeitet, es ist eine flache Funktion.

Möchten Ihre Verbesserungen und Notizen sehen.
danke. Shimmy

+0

Ein bisschen spät, aber ich stimme Ihrer Sicht auf Konverter. Sie sollten nicht mehr als 20 Zeilen (mehr oder weniger) schreiben müssen, damit eine einzelne Zeile der Funktionalität an das XAML übergeben werden kann –

0

Ich weiß, dass dieser Beitrag alt ist, aber es ist immer noch der erste, der bei der Suche nach "WPF TextBox Binding Trim" angezeigt wird.

Ich habe keine VB Antwort, aber bitte benutzen Sie keinen Konverter.
Gründe:

  1. A-Wandler bedeutet, dass Sie zusätzliche XAML-Code, um alle Ihre XAML Bindung jedes Mal hinzuzufügen haben. Das Hinzufügen von zusätzlichem Code ist in XAML genauso schlimm wie in C#/VB.
  2. Dies verhindert, dass Sie ein Leerzeichen eingeben, wenn Sie UpdateSourceTrigger = PropertyChanged festgelegt haben.

Verwenden Sie objektorientierte Programmierung, wie sie verwendet werden soll. Wenn Sie eine getrimmte TextBox benötigen, erstellen Sie eine untergeordnete TextBox mit der Bezeichnung TrimmedTextBox, und verwenden Sie diese. http://www.wpfsharp.com/2014/05/15/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 (verwendete ich einen Konverter auf meinem 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 

Hoffnung, das hilft. Bitte zögern Sie nicht, dieses Objekt zu benutzen, als wäre es eine Public Domain.

Verwandte Themen