Используйте обратную косую черту в ConverterParameter - PullRequest
2 голосов
/ 10 января 2012

У меня следующая проблема.
Я хочу разделить строку определенным символом.Это может быть запятая, пробел, табуляция или что-то еще.Я храню этот символ-разделитель в своем свойстве зависимостей Delimiter.

. В моем коде WPF есть следующий переключатель, который необходимо проверить, принадлежит ли Delimiter этому переключателю.Это код WPF:

<RadioButton IsChecked="{Binding ElementName=view, Path=Delimiter, Converter={StaticResource MyConverterToCheckForEquality}, ConverterParameter=\t}" Tag="\t" />

Если я проверяю параметр в моем конвертере, значение равно 't'.
Я хотел '\ t', поэтому я попробовал следующие опции:

  • \ t
  • \\ t
  • \\\ t
  • '\ t'
  • '\\ t'
  • '\\\ t'
  • & # 92; t
  • '& # 92; t'
  • {} {\ t}
  • '{} {\ t}'

(Примечание: я добавил дополнительные пробелы и обратную косую черту, чтобы отобразить его здесь правильно).
Результат очень печальный ... Тройная и двойная обратная косая чертадает мне двойную обратную косую черту, Single не дает мне ни одного.& # 92;также дает мне нулевую обратную косую черту.

Возможно, самое расстраивающее, что когда я использую свойство Tag для установки разделителя, \ t просто отлично работает и не лишний экранированный в процессе ...

Может кто-нибудь объяснить, почему это происходит, почему ни один из этих параметров не работает и как это исправить?

ОБНОВЛЕНИЕ
Когда я использую мультисвязывание в мультидатригере, результат отличается:

<Binding ElementName="view" Path="Delimiter" Converter="{StaticResource MyConverterToCheckForEquality}" ConverterParameter="\\\t" />

Значение параметра в моем преобразователе теперь равно '\\\\\\ t', однако я все еще не могу заставить его работать.

Я могу заменить значение, но это будетЯ имею в виду, что я должен использовать другую переменную в моем коде позади файла, что было бы довольно уродливо.Я думаю, что другого решения не существует.

Ответы [ 3 ]

5 голосов
/ 12 апреля 2012

Попробуйте это:

ConverterParameter='&#09;'

&#09; представляет \t (# 9 - ASCII-эквивалент горизонтальной табуляции)

Я проверил его, передав в конвертер какПараметр конвертера, и он отображается правильно.Вот мой тестовый код:

XAML:

<Window.Resources>
    <local:MyConverter x:Key="MyConverter" />
</Window.Resources>
<Grid Tag="NotUsed_Ignore">
    <TextBox Text="{Binding Converter={StaticResource MyConverter}, ConverterParameter='&#09;', RelativeSource={RelativeSource Mode=Self}}, Path=Parent.Tag" />
</Grid>

C # codebehind:

public sealed class MyConverter : IValueConverter
{
    public object Convert(object value, Type targetType,
                          object parameter, CultureInfo culture)
    {
        if (parameter.Equals("\t")) return "Success!";
        return "Failure!";
    }

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

Когда я запускаю это, в окне отображается TextBox с текстом «Success!«

0 голосов
/ 12 апреля 2012

Почему бы не попробовать что-то подобное:

public static class Delimiters {

    // ...
    public static char Tab { get { return '\t'; } }
    // ...

}

Тогда

<Binding ... ConverterParameter="{x:Static Delimiters.Tab}" ... />
0 голосов
/ 10 января 2012

Возможно, вам придется .Replace("\\", "\") косая черта ....

MSDN говорит следующее, но, видимо, это неправильно

Если следующим символом является «\» (кодовая точка Unicode 005C), используйте это «\», не добавляя его к текстовому значению, затем используйте следующее и добавьте его к значению.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...