【问题标题】:Use a backslash in the ConverterParameter在 ConverterParameter 中使用反斜杠
【发布时间】:2012-01-10 14:57:03
【问题描述】:

我有以下问题。
我想将字符串分隔为某个符号。这可以是逗号、空格、制表符或其他内容。 我将该分隔符存储在我的依赖属性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'
  • \t
  • '\t'
  • {}{\t}
  • '{}{\t}'

(注意:我添加了额外的空格和反斜杠以在此处正确显示)。
结果非常令人难过......三倍和双反斜杠给了我双反斜杠,单给我没有。 \也给了我零反斜杠。

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

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

更新
当我在多数据触发器中使用多重绑定时,结果是不同的:

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

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

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

【问题讨论】:

    标签: c# wpf data-binding escaping converter


    【解决方案1】:

    试试这个:

    ConverterParameter='&#09;'
    

    &amp;#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# 代码隐藏:

    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();
        }
    }
    

    当我运行它时,窗口会显示一个带有文本“成功!”的文本框

    【讨论】:

    • 我之前试过这个,但后来没用...不记得为什么=/。现在好像可以了,我再测试一下,非常感谢。
    • 这适用于绑定和多重绑定中的转换器参数,也适用于标签属性。再次非常感谢。
    • 没问题!很高兴我能帮忙:)
    【解决方案2】:

    你可能只需要.Replace("\\", "\")斜线....

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

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

    【讨论】:

    • 我马上试试。你是说converterparameter中的所有东西都会被放入stringformat?
    • @Mixxiphoid 不,但我使用{} 来转义绑定的StringFormat 参数中的特殊字符,因此认为它也适用于ConverterParameter。例如,{Binding SomeValue, StringFormat={}{0:C}}
    • 那不行,因为我使用的转换器是整个解决方案的通用转换器。此外,在转换器端修复它会很丑陋。我还应该能够将 Dependency 属性与它获得的值一起使用。不应该是我需要编辑输入以使其与出现故障的转换器参数兼容 =/...
    • 确实 MSDN 似乎说双反斜杠就足够了,但对于转换器参数显然不是这样。
    【解决方案3】:

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

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

    然后

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-04
      • 1970-01-01
      • 2012-12-09
      • 1970-01-01
      • 2014-10-07
      相关资源
      最近更新 更多