Quando si associa con WPF c'è un modo per utilizzare funcntions System.String senza l'utilizzo di convertitori?

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

Domanda

Quando si associa con WPF c'è un modo per utilizzare funcntions System.String senza l'utilizzo di convertitori ?

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

che è fondamentalmente il mio desiderio.

È stato utile?

Soluzione

Vorrei utilizzare un convertitore.

Binding 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
    }
}

E se 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

Altri suggerimenti

ho creato un convertitore definitiva per tutte le funzioni di System.String, ha bisogno di qualche miglioramento piacerebbe sentire da voi, la speranza di aggiornare in futuro, vi prego di accettare:

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 #:! -Converted da uno strumento, non si basano

 [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}" />

Poi, nel legame, quando u utilizzare un convertitore u hanno la possibilità di passare un parametro al convertitore (Binding.ConverterParameter) passare tutti i parametri separati con: (due punti - si può cambiare nel delimitatore String.Split parametro), mentre il primo parametro è il nome della funzione, la funzione conta i parametri extra e cercare di passarlo.
Io ancora non ha funzionato sui parametri di indirizzamento, è una funzione poco profonda.

Vorrebbe vedere i miglioramenti e le note.
Grazie. Shimmy

Sarà necessario utilizzare un convertitore come si vuole trasformare i dati vostro controllo è associato a. Per evitare di scrivere un sacco di convertitori semplici trasformazioni, è possibile utilizzare il Dynamic Language Runtime e scrivere espressioni nella tua lingua DLR scripting preferito (come Python, Ruby, etc).

mio blog serie per un esempio di come raggiungere questo obiettivo. Parte 3 parla specificamente di ValueConverters.

ho creato un convertitore definitiva per tutte le funzioni di System.String, ha bisogno di qualche miglioramento piacerebbe sentire da voi, la speranza di aggiornare in futuro, vi prego di accettare:

    <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

L'nel legame, quando u utilizzare un convertitore u hanno la possibilità di passare un parametro al convertitore (Binding.ConverterParameter) passare tutti i parametri separati con: (due punti - si può cambiare nel parametro String.Split delimitatore ), mentre il primo parametro è il nome della funzione, la funzione conta i parametri extra e cercare di passarlo.
Io ancora non ha funzionato sui parametri di indirizzamento, è una funzione poco profonda.

Vorrebbe vedere i miglioramenti e le note.
Grazie. Shimmy

So che questo post è vecchio, ma è ancora il primo che mostra quando la ricerca "WPF TextBox Binding Trim".

Non ho una risposta VB, ma per favore non utilizzare un convertitore.
Motivi:

  1. Un convertitore significa che dovete aggiungere il codice XAML in più per tutto il vostro XAML ogni legame. Dover aggiungere sempre il codice in più è proprio così male in XAML come in è C # / VB.
  2. Questo vi impedisce di digitare uno spazio se avete UpdateSourceTrigger = PropertyChanged set.

Usa programmazione orientata agli oggetti, come si suppone per essere utilizzato. Se avete bisogno di un controllo TextBox rifilati, quindi creare un bambino di TextBox chiamato TrimmedTextBox e usare quella. http://www.wpfsharp.com/2014/ 15/05 / a-simple-trimmedtextbox-per-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 (io ho usato un convertitore sul mio codice C #)

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

Spero che questo aiuti. Non esitare a utilizzare questo oggetto come se fosse di dominio pubblico.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top