При связывании с Wpf есть ли способ использовать функции System.String без использования конвертеров? - PullRequest
1 голос
/ 22 марта 2009

При связывании с Wpf существует ли способ использовать функции System.String без использования преобразователей ?

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

это в основном мое желание.

Ответы [ 5 ]

7 голосов
/ 22 марта 2009

Я бы использовал конвертер.

Связывание 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
1 голос
/ 27 марта 2009

Я создал лучший конвертер для всех функций в 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
}

Xaml:

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

Затем в привязке, когда вы используете конвертер, у вас есть возможность передать параметр конвертеру (Binding.ConverterParameter), передав все ваши параметры, разделенные: параметр), в то время как первый параметр является именем функции, функция будет считать дополнительные параметры и попытаться передать его.
Я до сих пор не работал с адресацией параметров, это мелкая функция.

Хотелось бы увидеть ваши улучшения и заметки.
Благодарю. Shimmy

0 голосов
/ 16 мая 2014

Я знаю, что это сообщение старое, но оно все еще первое, которое появляется при поиске "WPF TextBox Binding Trim".

У меня нет ответа на VB, но, пожалуйста, не используйте конвертер.
Причины:

  1. Конвертер означает, что вам необходимо каждый раз добавлять дополнительный код XAML ко всей привязке XAML. Необходимость всегда добавлять дополнительный код в XAML так же вредна, как и в C # / VB.
  2. Это предотвратит ввод пробела, если у вас установлено UpdateSourceTrigger = PropertyChanged.

Используйте объектно-ориентированное программирование так, как оно предполагается использовать. Если вам нужен Trimmed TextBox, создайте дочерний элемент TextBox с именем TrimmedTextBox и используйте его. 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

Надеюсь, это поможет. Пожалуйста, не стесняйтесь использовать этот объект, как если бы он был общественным достоянием.

0 голосов
/ 22 марта 2009

Вам нужно будет использовать конвертер, поскольку вы хотите преобразовать данные, к которым привязан ваш элемент управления. Чтобы избежать написания преобразователями простых преобразований, вы можете использовать Dynamic Language Runtime и писать выражения на вашем любимом языке сценариев DLR (например, Python, Ruby и т. Д.).

См. мою серию блогов для примера того, как этого добиться. Часть 3 конкретно говорит о ValueConverters.

0 голосов
/ 22 марта 2009

Я создал лучший конвертер для всех функций в 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 ), в то время как первый параметр является именем функции, функция будет считать дополнительные параметры и попытаться передать его.
Я до сих пор не работал с адресацией параметров, это мелкая функция.

Хотелось бы увидеть ваши улучшения и заметки.
Благодарю. Shimmy

...