绑定到字典 - 键为“(”

3

我有一些数据模板,看起来像这样:

<DataTemplate>
 <TextBlock DataContext="{Binding Fields[ABC]}" Text="{Binding}"/>
</DataTemplate>

<DataTemplate>
 <TextBlock DataContext="{Binding Fields[)]}" Text="{Binding}"/>
</DataTemplate>

对于一个看起来像这样的类:

class Source {
  public Dictionary<string, string> Fields { get; private set; }
}

当应用第二个模板时,使用DataContext绑定中的')'键会导致XamlParseException。是否有办法使字典绑定能够与其他字符串(如“)”)一起工作?是否有某种转义字符序列可用?

我会尝试使用直通转换器,看看是否可以绕过这个解析异常。或者使用Linq进行转换,代码如下:strOut = dl.FirstOrDefault(kvp => kvp.Key == "(").Value;虽然不太美观,但如果比什么都没有要好的话,那就用它吧。 - paparazzo
尝试:<TextBlock DataContext="{Binding Fields[')']}" Text="{Binding}"/> - Jake Berger
@jberger:那行不通,因为它会抛出这个错误:错误1:MarkupExtension中的名称和值不能包含引号。MarkupExtension参数'Fields[')']}'无效。 - H.B.
我在最近的答案中看到过类似的东西,所以值得一试。 - Jake Berger
1个回答

2
您可以使用路径参数构建有效路径,这将确保括号被传递为字符串而不是路径描述的一部分。最简单的方法可能是通过自定义标记扩展来完成,如我在这个答案中所示。
然后绑定可以写成:
{Binding Path={me:PathConstructor Fields[(0)],')'}}

(括号中的引号是可选项,但可以使其更易读)

谢谢,这有助于指导我朝正确的方向前进。我想最终真正的问题在于一些字典元素中有前导/尾随空格。这个PathConstructor格式有助于解决这个问题。 - Sheldon Warkentin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接