2015-03-03 9 views
-1

У меня есть имя, такое как Джонни Браво, и я бы хотел, чтобы мой ярлык отражал инициалы этого имени (JB) через Binding. Как я могу?Получить Инициалы имени C# XAML через привязку

Мне нужен код полностью через XAML/Binding и возможный ValueConverter, если необходимо. Какие-либо предложения?

+0

поставить недвижимость в вас r ViewModel, в качестве быстрого решения, в противном случае реализует конвертер. Что вы пробовали? –

ответ

1

Используйте 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}}" /> 
+0

У меня есть одно свойство для имени и одно для Инициалов. И я хочу, чтобы инициалы обновлялись автоматически в соответствии с полями Инициалы имени. Можете ли вы опубликовать несколько примеров? – user3524375

+0

Возможно, было бы проще иметь конвертер для того, где вы хотите отображать инициалы, так что вам не нужно было бы иметь другое свойство. –

+0

Да, я думал об этом. У вас есть примеры кода для этого? – user3524375

0

Заполните Initials свойство внутри сеттер в FullName собственности на свой ViewModel

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

Или создать ValueConverter как уже предложил.

0

Использование конвертера значений было бы правильным путем, потому что в случае необходимости оно может использоваться в других местах вашего кода.

Вот быстрый, который я бросил вместе с помощью 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}}"/> 

Нет нейтрализатор:

Использование преобразователя:

+0

обе работа, но по какой-то причине я получил только первое письмо. Я использую метку и указываю на эту метку в том же окне. есть идеи? – user3524375

+0

Захватите точку останова в методе 'InitialsConverter.Convert' и пройдитесь - вы можете решить, что не так. – learningcs

+0

справедливо! Спасибо за вашу помощь! – user3524375

Смежные вопросы