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

通过绑定获取名字C#XAML的首字母缩写,c#,wpf,xaml,binding,C#,Wpf,Xaml,Binding,我有一个名字,比如Jonny Bravo,我希望我的标签能够通过绑定反映这个名字(JB)的首字母缩写。我该怎么办 我需要一个完全通过XAML/绑定和可能的ValueConverter(如果需要)的代码。有什么建议吗?使用ValueConverter 转换器: public class InitialsConverter : IValueConverter { public object Convert(object value, Type targetType, object param

我有一个名字,比如Jonny Bravo,我希望我的标签能够通过绑定反映这个名字(JB)的首字母缩写。我该怎么办


我需要一个完全通过XAML/绑定和可能的ValueConverter(如果需要)的代码。有什么建议吗?

使用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的FullName属性的Setter中填充Initials属性

Public string FullName{
...
Set{
this.fullName = value;
this.Initials = GenerateInitialsFromFullName();
}

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

使用值转换器将是一个不错的选择,因为如果需要,它可以在代码中的其他地方重用

这里有一个我用正则表达式快速拼凑的查找第一个字母的例子(请注意,拆分字符串将提供更好的性能)

用法:

<!--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}}"/>

无转换器:

使用转换器:


在ViewModel中放置一个属性,作为快速解决方案,否则实现一个转换器。你试过什么?我有一个名字的属性和一个首字母的属性。我想根据Name字段的首字母自动更新首字母。你能举一些例子吗?如果有一个转换器来显示首字母,你就不需要另外的属性了。是的,我在想。你有任何这样的代码示例吗?我编辑了答案以显示转换器工作的一种可能方式。您可能需要考虑一些额外的逻辑,因为带有ie.III或Jr.的名称将无法正确工作。它将适用于First、Middle、Last等。尽管您的代码可以工作,但出于某种原因,它只会带来名字。你知道为什么吗?因为在你的代码中,我可以清楚地看到它拆分单词。两者都有效,但出于某种原因,我只能得到第一个字母。我正在使用标签,并指向同一窗口中的标签。有什么想法吗?在
InitialsConverter.Convert
方法中插入一个断点,然后一步一步地进行--这样你就可以找出问题所在。
<!--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}}"/>