通过绑定获取名字 C# XAML 的首字母

Get Initials of First Name C# XAML through Binding

我有一个名字,例如 Jonny Bravo,我希望我的标签通过绑定反映该名字 (JB) 的首字母。我该怎么办?

我需要一个完全通过 XAML/Binding 的代码,如果需要的话可能还需要 ValueConverter。有什么建议吗?

使用值转换器。

转换器:

public class InitialsConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        string s = value as string;
        string i = string.Empty;

        if (s != null)
        {
            string[] split = s.Split(" ".ToCharArray(), StringSplitOptions.RemoveEmptyEntries);

            foreach (string piece in split)
            {
                i += piece[0];
            }
        }

        return i;
    }

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

Xaml 使用:

<TextBox Text="{Binding Name, Converter={StaticResource InitialsConverter}}" />

在您的 viewModel

的全名 属性 的 Setter 中填写首字母 属性
Public string FullName{
...
Set{
this.fullName = value;
this.Initials = GenerateInitialsFromFullName();
}

或者按照建议创建一个 ValueConverter。

使用值转换器是可行的方法,因为如果需要,它可以在代码的其他地方重复使用。

这是我使用 Regex 拼凑起来的快速查找第一个字母的方法(请注意,拆分字符串会提供更好的性能)。

public class InitialsConverter : IValueConverter
{
    public virtual object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        string str = value as string;
        if (str != null)
        {
            string s = "";
            MatchCollection matches = Regex.Matches(str, @"(\b\w)");
            foreach (Match m in matches)
                s += m.Value;
            return s;
        }
        else
        {
            return null;
        }
    }

    public virtual object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

用法:

<!--Declare in your scope's resources-->
<Window.Resources>
    <r:InitialsConverter x:Key="initials"/>
</Window.Resources>

<!--Bind to a string using the converter-->
<TextBlock Text="{Binding MyName, Converter={StaticResource initials}}"/>

没有转换器:

使用转换器: