"Binding="{Binding (0)}"的含义是什么?"

8
我找到了这个:
<DataTrigger Value="True" Binding="{Binding (0)}">
RibbonMenuButton模板中的触发器是什么意思?我尝试过谷歌搜索,但没有找到任何结果。
更新更多代码:
<ControlTemplate x:Key="RibbonMenuButtonControlTemplate1" TargetType="{x:Type RibbonMenuButton}">
...
    <DataTrigger Binding="{Binding (0)}" Value="True">
        <Setter Property="TextElement.Foreground" TargetName="MainGrid" Value="{DynamicResource {x:Static SystemColors.MenuTextBrushKey}}"/>
        <Setter Property="PathFill" TargetName="TwoLineText" Value="{DynamicResource {x:Static SystemColors.MenuTextBrushKey}}"/>
        <Setter Property="CornerRadius" TargetName="OuterBorder" Value="0"/>
        <Setter Property="Background" TargetName="OuterBorder" Value="Transparent"/>
        <Setter Property="BorderBrush" TargetName="OuterBorder" Value="Transparent"/>
    </DataTrigger>
...

在RibbonMenuButton控件上按下“编辑模板”按钮后,在Blend中创建了此代码。

你确定绑定中没有 StringFormat 吗?能否发布一下参考文献? - Rohit Vats
是的,我确定。这是完整的XAML。 - Mikhail Gubanov
2
请问您能否提供更多的代码或上下文信息呢? - dev hedgehog
添加了代码到问题中。 - Mikhail Gubanov
3个回答

3
这种情况只能出现在标记化路径格式中。请参阅Storyboards概述下的“间接定位”代码示例。但在XAML代码中,这是无效的。我想发生的事情可能是这样的:
// something goes wrong here, and GetProperties returns an empty array
var propertyChain = GetProperties();

var path = new PropertyPath("(0)", propertyChain);

trigger.Binding = new Binding { Path = path };

有了空的PathParameters,XAML生成器可能会转储原始的标记化路径。

3
看起来像是一个错误。据我所知,在WPF中不能使用这种类型的Binding。以下是一个缺陷列表,请注意第一段摘自connect.microsoft.com (archive):

我试图为Ribbon控件(System.Windows.Controls.Ribbon)设置样式,但我总是遇到问题。

  • 如果我使用Blend或另一个工具复制Ribbon、RibbonGroup和RibbonTab等默认模板,这些模板会出现错误。存在像{Binding (0)}这样的绑定。

  • 我无法更改Ribbon控件的高度。

  • 不可能更改RibbonGroup的模板,更改分隔符的外观并将标题放置在组的左上角。

  • 无法向ApplicationMenuButton添加标签。此外,该按钮具有固定宽度。

  • 我无法删除Ribbon控件底部的边框。

据我所知,没有热修复。


这是调用XamlWriter.Save(controlName.Template, xmlWriter)后的代码吗? - dev hedgehog
1
@dev hedgehog:不,这是“ControlTemplate”的源代码。 - Anatoliy Nikolaev
嘿,如果你的VS可以打开项目,你能运行XamlWriter.Save吗? - dev hedgehog
@dev hedgehog:很遗憾,我的版本较低,无法打开它。 - Anatoliy Nikolaev
原始的 MSFT 链接已经失效,因此我添加了一个指向存档副本的链接。 - StayOnTarget
1
我在https://developercommunity.visualstudio.com/content/problem/545784/invalid-syntax-inside-ribbon-control-templates-bin.html上报告了这个问题。 - StayOnTarget

1

很抱歉将此作为答案发布,但它无法适应评论区。

你给我们的上下文仍然太少了,但这是我的猜测。

它是某个东西的占位符。在WPF世界中,占位符很少见但很有用。根据你给我们的信息,这是我能想到的唯一合理解释。

我见过一些占位符,这是个聪明的想法。

通常,如果你有许多不同主题和不同资源名称的主题,你最终会创建这样的占位符,这些占位符将在预构建或后构建时完成xaml文件。

这意味着您点击构建操作之后,在编译xaml文件之前或之后,将组合xaml文件,并执行由编写该功能区域的人提供的工具,以注入正确的主题资源名称而不是占位符。

任何东西都可以放在占位符的位置...

你从哪里获得那段代码的?你能使用Snoop工具查看DataContext吗?

请提供更多上下文。

我建议你在运行时将模板转储到文件中,然后你就会知道发生了什么。

以下是如何操作:

var stringBuilder = new StringBuilder();
var xmlSettings = new XmlWriterSettings
{
  Indent = true
};

using (var xmlWriter = XmlWriter.Create(stringBuilder, xmlSettings))
{
  XamlWriter.Save(controlName.Template, xmlWriter);
}

如果您在运行时转储到文件的模板中不再有0,则表示它是一个该死的占位符。 :) :) :)
请测试一下并告诉我们。

1
据我所知,没有DataContext。您可以通过单击我的答案中的connect.microsoft.com链接(附件中的RibbonTest2.zip)查看完整的代码。 - Anatoliy Nikolaev
由于某种原因,当我打开那个解决方案时我的Visual Studio崩溃了。您能否尝试使用我发布的代码在运行时保存模板?请告诉我它看起来是什么样子的。发现Binding(0)是什么非常有趣。对我来说,它似乎像一个占位符。在ribbontest2解决方案中有很多绑定(0)吗? - dev hedgehog

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