Wpf とバインドする場合、コンバーターを使用せずにSystem.String 関数を使用する方法はありますか?
<TextBlock Text="({Binding Path=Text}).Trim()"/>
それが基本的に私の願いです。
Wpf とバインドする場合、コンバーターを使用せずにSystem.String 関数を使用する方法はありますか?
<TextBlock Text="({Binding Path=Text}).Trim()"/>
それが基本的に私の願いです。
私ならコンバーターを使います。
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
コントロールがバインドされているデータを変換するため、コンバーターを使用する必要があります。多数のコンバーターの単純な変換を記述しないようにするために、動的言語ランタイムを使用して、お気に入りのDLRスクリプト言語(Python、Rubyなど)で式を記述できます。
これを実現する方法の例については 、私のブログシリーズを参照してください。第3部では、ValueConvertersについて具体的に説明します。
この投稿が古いことは知っていますが、「WPF TextBox Binding Trim」を検索すると、まだ最初に表示されます。
VB の回答はありませんが、コンバーターは使用しないでください。
理由:
オブジェクト指向プログラミングを、本来の使用方法で使用してください。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
お役に立てれば。このオブジェクトは、パブリック ドメインであるかのように自由に使用してください。
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 区切りパラメーターで変更できます) で区切られたすべてのパラメーターを渡します。最初のパラメーターは関数名です。関数は余分なパラメーターを数えて、それを渡そうとします。
私はまだパラメーターのアドレス指定に取り組んでいませんでした。これは浅い機能です。
改善点と注意点を教えてください。
ありがとう。シミー