Binding =“{Binding(0)}”是什么意思?

问题描述 投票:8回答:3

我找到了这个:

<DataTrigger Value="True" Binding="{Binding (0)}">

RibbonMenuButton模板中触发。这是什么意思?我试过谷歌,但一无所获。

UPD更多代码:

<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中创建此代码。

wpf expression-blend controltemplate datatrigger ribbon-control
3个回答
3
投票

它看起来像一个bug。据我所知,在WPF中不能是这种类型的Binding。以下是缺陷清单,请注意引自connect.microsoft.comarchive)的第一段:

我正在尝试设置功能区控件(System.Windows.Controls.Ribbon)并且我一直遇到问题。

  • 如果我使用Blend或其他工具来复制功能区的默认模板,RibbonGroup,RibbonTab等,则这些模板会出错。有像{Binding (0)}这样的绑定。
  • 我无法更改功能区控件的高度。
  • 无法更改RibbonGroup的模板,更改分隔符的外观以及将标题放在组的左上角。
  • 无法向ApplicationMenuButton添加标签。此外,此按钮具有固定的宽度。
  • 我无法删除功能区控件底部的边框。

据我了解,没有修补程序。


3
投票

唯一一次出现在tokenized path format。请参阅Storyboards Overview中“间接定位”下的代码示例。但是,在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生成器可能会转储原始标记化路径。


1
投票

很抱歉将此作为答案,但它不适合评论。

你给我们的背景仍然太少了,不过这是我的猜测。

它是一个东西的占位符。占位符在wpf世界中很少见,但很有用。这就是我现在想到的所有信息,包括你给我们的信息。它是唯一对我有意义的东西。

我见过几个占位符。这是一个聪明的主意。

通常,如果您有许多具有不同资源名称的不同主题,您将最终创建这样的占位符,这些占位符将在构建前或构建后完成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),那么您将知道它是一个固定的占位符。 :) :) :) :)

你可以试一试,告诉我们。

© www.soinside.com 2019 - 2024. All rights reserved.