Подстрока связанной строки

Я хочу привязать строку к текстовому блоку или триггеру данных (в основном, некоторому объекту WPF) и взять часть строки. Эта строка будет разделена. Так, например, у меня есть такая строка:

String values = "value1|value2";

И у меня есть два элемента управления - txtBlock1 и txtBlock2.

В txtBlock1 я хотел бы установить свойство Text как Text={Binding values}. В txtBlock2 я хотел бы установить свойство Text как Text={Binding values}.

Очевидно, это будет отображать ту же строку, поэтому мне нужно какое-то выражение StringFormat, чтобы добавить к этой привязке к значениям подстроки, чтобы txtBlock1 читал value1, а txtBlock2 читал value2.

Я хорошо читал, и это похоже на следующее: Wpf Binding Формат строки для отображения только первого символа - это типичное предлагаемое решение. Но это кажется ужасно многословным для того, чего я здесь пытаюсь достичь.

Большое спасибо за любую помощь заранее.


person SkonJeet    schedule 07.02.2012    source источник


Ответы (3)


Здесь вам нужен конвертер. Добавьте параметр конвертера, чтобы указать индекс.

public class DelimiterConverter : IValueConverter
{
    public object Convert(Object value, Type targetType, object parameter, CultureInfo culture)
    {
        string[] values = ((string)value).Split("|");
        int index = int.Parse((string)parameter);
        return values[index];
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        return "";
    }

Затем вы просто указываете индекс значения в XAML с атрибутом ConverterParameter.

person AkselK    schedule 07.02.2012

Я бы использовал преобразователь значений, как описано в приведенном вами примере.

Но если вам нужно что-то более простое, вы можете использовать следующее свойство и привязки:

public string[] ValueArray
{
    get
    {
        return values.Split('|');
    }
}

<TextBlock Text="{Binding ValueArray[0]}" />
<TextBlock Text="{Binding ValueArray[1]}" />

Но позаботьтесь о том, что может случиться, если values либо равно нулю, либо не содержит |.

person ken2k    schedule 07.02.2012

Если у вас всего две строки, вы можете просто сделать:

<TextBlock Text=Text={Binding value1}/>
<TextBlock Text=Text={Binding value2}/>

и

public string value1
{
   get{return values.Split('|')[0]}
   set{values = value + values.Remove(0, values.IndexOf('|')+1)}
}
public string value2 ....
public string values ...

Фактически, вы можете написать функцию для set value и get value для связанного индекса (расширить вышеупомянутый подход), но если вам не нравится этот синтаксис, IMO то, что вы упомянули, является лучшим вариантом для вас.

person Saeed Amiri    schedule 07.02.2012
comment
Текстовый блок, к которому я привязываю строку, будет частью таблицы данных для элементов списка. Таким образом, строка будет отличаться для каждого элемента. Большое спасибо за ваш ответ, я уверен, что смогу как-то использовать ваше решение здесь. - person SkonJeet; 07.02.2012