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 に答える
0

コントロールがバインドされているデータを変換するため、コンバーターを使用する必要があります。多数のコンバーターの単純な変換を記述しないようにするために、動的言語ランタイムを使用して、お気に入りのDLRスクリプト言語(Python、Rubyなど)で式を記述できます。

これを実現する方法の例については 、私のブログシリーズを参照してください。第3部では、ValueConvertersについて具体的に説明します。

于 2009-03-22T07:22:19.163 に答える
0

この投稿が古いことは知っていますが、「WPF TextBox Binding Trim」を検索すると、まだ最初に表示されます。

VB の回答はありませんが、コンバーターは使用しないでください。
理由:

  1. コンバーターとは、毎回すべての XAML バインディングに追加の XAML コードを追加する必要があることを意味します。余分なコードを常に追加しなければならないことは、C#/VB と同じように XAML でも問題です。
  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 に答える
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 に答える