2

我正在尝试使用另一个 SO 用户提供给我的帮助器类在标签上应用字符串格式。但是,当我应用他的解决方案时,出现以下错误:

The object 'Label' already has a child and cannot add ''. 'Label' can accept only one child.

这是标签:

<Label Grid.Column="1"
       Grid.Row="1">
    <ui:Helper.Text>
        <PriorityBinding>
            <Binding Path="Worker.Employer.Name" StringFormat="Employer: {0}" />
            <Binding Source="Unemployed" />
        </PriorityBinding>
    </ui:Helper.Text>
    <Binding RelativeSource="{RelativeSource Self}" Path="(ui:Helper.Text)" />
</Label>

错误指向“Binding RelativeSource ...”行。我能做些什么来解决这个问题?我想使用Labels 而不是TextBlocks,但它已经到了可能不值得的地步。

4

2 回答 2

3

看起来就像 xaml 的一个案例,假设您的附加属性ContentLabel

只需将您的实际包装Content在一个明确的<Label.Content>

<Label Grid.Row="1"
       Grid.Column="1">
  <ui:Helper.Text>
    <PriorityBinding>
      <Binding Path="Worker.Employer.Name"
               StringFormat="Employer: {0}" />
      <Binding Source="Unemployed" />
    </PriorityBinding>
  </ui:Helper.Text>
  <Label.Content>
    <Binding Path="(ui:Helper.Text)"
             RelativeSource="{RelativeSource Self}" />
  </Label.Content>
</Label>
于 2013-06-21T20:41:49.487 回答
1

在没有测试 i 的情况下,我认为附加属性的定义中存在错误,因为它附加到Helper类本身而不是Label. 这样,您只需Helper在标签内容中创建一个新实例。然后,当您也将绑定添加到内容时,您会得到异常,因为已经存在内容。

无论如何,我实际上并没有看到将其作为附加属性的理由,并且绑定到 self 的附加属性对我来说似乎很笨拙。

尝试以下操作;通过将 Helper.Text 替换RegisterAttached(...)Register(...). (将 helper 重命名为CompositeString.)然后将 CompositeString 定义为标签的资源,并将标签的内容绑定到该资源:

<Label>
    <Label.Resources>
        <ui:CompositeString>
            <ui:CompositeString.Text>...</ui:CompositeString.Text>
        </ui:CompositeString>
    </Label.Resources>
    <Label.Content>
        <Binding Path="Text" Source="{StaticResource Test}" />
     </Label.Content>
</Label>

请注意,需要在绑定到内容之前定义资源,这就是绑定获取自己标签的原因。

于 2013-06-19T07:04:16.170 回答