1

与 Wpf 绑定时,有没有办法在不使用转换器的情况下使用 System.String 函数?

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

这基本上是我的愿望。

4

5 回答 5

7

我会使用转换器。

绑定 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
    }
}

如果 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
于 2009-03-22T05:03:08.237 回答
1

我为 System.String 中的所有功能创建了一个终极转换器,需要一些改进希望收到您的来信,希望将来更新它,请接受:

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#:-由工具转换,不要依赖!

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

xml:

<TextBox Text="{Binding Path=String, Converter={StaticResource StringConverter}, ConverterParameter=Trim:Argument:AnotherArgument}" />

然后,在绑定中,当您使用转换器时,您可以选择将参数传递给转换器(Binding.ConverterParameter)传递所有参数,并用:(冒号 - 您可以在 String.Split 分隔符参数中更改它),而第一个参数是函数名,该函数会计算额外的参数并尝试传递它。
我仍然没有处理参数寻址,这是一个浅层函数。

希望看到您的改进和说明。
谢谢。摇摆

于 2009-03-26T23:12:55.433 回答
0

我为 System.String 中的所有功能创建了一个终极转换器,需要一些改进希望收到您的来信,希望将来更新它,请接受:

    <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

在绑定中,当您使用转换器时,您可以选择将参数传递给转换器 (Binding.ConverterParameter) 传递所有参数,并以 : 分隔(冒号 - 您可以在 String.Split 分隔符参数中更改它),而第一个参数是函数名,函数会统计多余的参数并尝试传递。
我仍然没有处理参数寻址,这是一个浅层函数。

希望看到您的改进和说明。
谢谢。摇摆

于 2009-03-22T06:44:15.217 回答
0

您需要使用转换器来转换控件绑定的数据。为避免编写大量转换器简单的转换,您可以使用动态语言运行时并以您最喜欢的 DLR 脚本语言(如 Python、Ruby 等)编写表达式。

有关如何实现此目的的示例, 请参阅我的博客系列。第 3 部分专门讨论了 ValueConverters。

于 2009-03-22T07:22:19.163 回答
0

我知道这篇文章很旧,但它仍然是搜索“WPF TextBox Binding Trim”时出现的第一个。

我没有 VB 答案,但请不要使用转换器。
原因:

  1. 转换器意味着您每次都必须向所有 XAML 绑定添加额外的 XAML 代码。必须总是添加额外的代码在 XAML 中和在 C#/VB 中一样糟糕。
  2. 如果您设置了 UpdateSourceTrigger=PropertyChanged,这将阻止您输入空格。

使用应该使用的面向对象编程。如果您需要一个 Trimmed TextBox,则创建一个名为 TrimmedTextBox 的 TextBox 的子项并使用它。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(我在我的 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

希望这可以帮助。请随意使用这个对象,就好像它是公共领域一样。

于 2014-05-16T15:57:34.123 回答