عند الربط مع Wpf، هل هناك طريقة لاستخدام وظائف System.String دون استخدام المحولات؟

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

سؤال

عند الربط مع Wpf، توجد طريقة لاستخدام وظائف System.String دون استخدام المحولات?

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

هذه هي رغبتي في الأساس.

هل كانت مفيدة؟

المحلول

وأود أن استخدام محول.

ملزمة XML

<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

نصائح أخرى

لقد قمت بإنشاء محول نهائي لجميع الوظائف في System.String، ويحتاج إلى بعض التحسين، وأحب أن أسمع منك، وآمل في تحديثه في المستقبل، ويرجى قبول:

فب:

<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

ج#:-تحويل بواسطة أداة، لا تعتمد!

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

كامل:

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

بعد ذلك، في عملية الربط، عندما تستخدم محولًا، يكون لديك خيار لتمرير معلمة إلى المحول (Binding.ConverterParameter) وتمرير جميع المعلمات الخاصة بك بشكل منفصل مع:(نقطتان - يمكنك تغييره في معلمة محدد String.Split)، في حين أن المعلمة الأولى هي اسم الوظيفة، فستحسب الوظيفة المعلمات الإضافية وتحاول تمريرها.
ما زلت لم أعمل على معالجة المعلمات، إنها وظيفة ضحلة.

أود أن أرى التحسينات والملاحظات الخاصة بك.
شكرًا.إهتز

ستحتاج إلى استخدام محول كما تريد لتحويل البيانات التي يرتبط بها عنصر التحكم الخاص بك.لتجنب كتابة الكثير من المحولات والتحويلات البسيطة، يمكنك استخدام Dynamic Language Runtime وكتابة التعبيرات بلغة البرمجة النصية DLR المفضلة لديك (مثل Python وRuby وما إلى ذلك).

يرى سلسلة مدونتي للحصول على مثال لكيفية تحقيق ذلك. الجزء 3 يتحدث على وجه التحديد عن ValueConverters.

لقد قمت بإنشاء محول نهائي لجميع الوظائف في 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)، في حين أن المعلمة الأولى هي اسم الوظيفة، فستحسب الوظيفة المعلمات الإضافية وتحاول تمريرها.
ما زلت لم أعمل على معالجة المعلمات، إنها وظيفة ضحلة.

أود أن أرى التحسينات والملاحظات الخاصة بك.
شكرًا.إهتز

أعلم أن هذا المنشور قديم، لكنه لا يزال أول منشور يظهر عند البحث عن "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/

ج#

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

أتمنى أن يساعدك هذا.من فضلك لا تتردد في استخدام هذا الكائن كما لو كان مجالًا عامًا.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top