标签内容模板中的绑定

6
在下面的Xaml中,第一个控件(单独的TextBlock)没有问题地绑定和呈现了RecordCount的值。但是在第二个控件(ContentTemplate中的Label)中,RecordCount的值没有呈现。但是,字面上的"Cars"被很好地呈现了。所以我知道ContentTemplate正在工作,但是从ContentTemplate内部绑定到RecordCount的绑定不正确。我做错了什么?
<TextBlock Text="{Binding RecordCount}"/>

<Label HorizontalAlignment="Center" >
     <Label.ContentTemplate>
          <DataTemplate>
               <StackPanel Orientation="Horizontal" Width="100">
                    <TextBlock Text="{Binding RecordCount}"/>
                    <TextBlock Text=" Cars"/>
               </StackPanel>
          </DataTemplate>
     </Label.ContentTemplate>
</Label>
2个回答

14

将Label的Content属性设置为当前的DataContext:

<Label HorizontalAlignment="Center" Content="{Binding}">

或者,将StackPanel设置为内容,根本不使用模板:

<Label HorizontalAlignment="Center">
    <StackPanel Orientation="Horizontal" Width="100">
        <TextBlock Text="{Binding RecordCount}"/>
        <TextBlock Text=" Cars"/>
    </StackPanel>
</Label>

ContentTemplate用于呈现Content。因为它是null,所以在实例化模板时DataContext也是null。TextBlocks仍然被创建,因此Cars被呈现,但是null没有RecordCount属性,所以第一个文本块显示为空白。

此外,如果您只使用两个TextBlock来连接文本,则可以在.NET 3.5 SP1或更高版本中使用StringFormat属性:

<Label Content="{Binding RecordCount}" ContentStringFormat="{}{0} Cars"/>

首先,感谢您提供的解决方案。更重要的是,感谢您的解释。我现在完全理解了机制。但是我必须将这种理解留到另一天,因为是的,ContentStringFormat正是我所需要的 - 我甚至不知道它的存在。再次感谢! - Mark Bostleman

0

只是另一种选择,您可以将RecordCount绑定到LabelContent,并让DataTemplate来处理您将如何显示它。

<Label HorizontalAlignment="Center" Content="{Binding RecordCount}" >
     <Label.ContentTemplate>
          <DataTemplate>
               <StackPanel Orientation="Horizontal" Width="100">
                    <TextBlock Text="{Binding}"/>
                    <TextBlock Text=" Cars"/>
               </StackPanel>
          </DataTemplate>
     </Label.ContentTemplate>
</Label>

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