在ConverterParameter中使用反斜杠

时间:2012-01-10 14:57:04

标签: c# wpf data-binding escaping converter

我有以下问题 我想将字符串分隔为某个符号。这可以是逗号,空格,制表符或其他内容。 我将分隔符符号存储在我的依赖项属性Delimiter中。

在我的WPF代码中,我有以下单选按钮,如果Delimiter属于该单选按钮,则应该检查该单选按钮。 这是WPF代码:

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

如果我检查转换器中的参数,则值为't' 我想'\ t'所以我尝试了以下选项:

  • \吨
  • \\吨
  • \\\吨
  • '\ T'
  • '\\ T'
  • '\\\ T'
  • &安培; #92;吨
  • '&安培; #92; T'
  • {} {\吨}
  • '{} {\吨}'

(注意:我添加了额外的空格和反斜杠,以便在此处正确显示) 结果非常令人难过...... Triple和Double反斜杠给了我双反斜杠,Single给我没有。 &安培; #92;也给了我零反斜杠。

也许最令人沮丧的是,当我使用Tag属性设置分隔符时,\ t工作正常,并且在此过程中不会额外转义......

有人可以解释为什么会发生这种情况,为什么这些选项都不起作用以及如何修复它?

更新
当我在multidatatrigger中使用多重绑定时,结果是不同的:

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

我的转换器中的参数值现在为'\\\\\\ t',但我仍然无法使其正常工作。

我可以替换该值,但这意味着我必须在我的代码后面使用不同的变量,这将非常难看。我想没有其他解决方案。

3 个答案:

答案 0 :(得分:5)

试试这个:

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!”

答案 1 :(得分:0)

您可能只需要.Replace("\\", "\")斜杠....

MSDN说了以下内容,但显然这是不正确的

  

如果下一个字符是“\”(Unicode代码点005C),请使用它   “\”而不将其添加到文本值,然后使用以下内容   字符并将其附加到值。

答案 2 :(得分:0)

为什么不尝试这样的事情:

public static class Delimiters {

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

}

然后

<Binding ... ConverterParameter="{x:Static Delimiters.Tab}" ... />