2011-03-17 125 views
1

我想为一个标签定义一个数据模板。这可能吗?由于找不到有用的东西,所以我定义了一个控件模板并试图让事情顺利进行。不幸的是,当我按如下方式绑定两个项目时,即使具有给定参数的对象已成功绑定到后面代码的标签,我也会得到标签不显示任何内容。请帮忙!WPF标签DataTemplate

<Setter Property="Template"> 
      <Setter.Value> 
       <ControlTemplate TargetType="Label"> 
        <Border> 
         <Grid> 

          <Grid.ColumnDefinitions> 
           <ColumnDefinition Width="Auto"></ColumnDefinition> 
           <ColumnDefinition Width="Auto"></ColumnDefinition> 
          </Grid.ColumnDefinitions> 

          <TextBlock Background="Green" Text="{Binding TableName}" Grid.Column="0"></TextBlock> 
          <TextBlock Background="Red" Text="{Binding ColumnName}" Grid.Column="1"></TextBlock> 

         </Grid> 
        </Border> 
       </ControlTemplate> 
      </Setter.Value> 
     </Setter> 

编辑:在window.resources全XAML中的要求

<Window.Resources> 

    <Style x:Key="myLabelTemplate" TargetType="Label"> 
     <!--<Setter Property="Background" Value="DarkKhaki"></Setter> 
     <Setter Property="Foreground" Value="White"></Setter>--> 

     <Setter Property="Template"> 
      <Setter.Value> 
       <ControlTemplate TargetType="Label"> 
        <Border> 
         <Grid> 

          <Grid.ColumnDefinitions> 
           <ColumnDefinition Width="Auto"></ColumnDefinition> 
           <ColumnDefinition Width="Auto"></ColumnDefinition> 
          </Grid.ColumnDefinitions> 

          <!-- <TextBlock Background="Green" Text="{Binding TableName}" Grid.Column="0"></TextBlock> 
          <TextBlock Background="Red" Text="{Binding ColumnName}" Grid.Column="1"></TextBlock>--> 

         </Grid> 
        </Border> 
       </ControlTemplate> 
      </Setter.Value> 
     </Setter> 

    </Style> 


    <!-- <ControlTemplate TargetType="Label" x:Key="tablelLabel"> 
     <Grid> 
      <Border BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="5" CornerRadius="5"> 
       <Border.Background> 
        <SolidColorBrush Color="#50000000"></SolidColorBrush> 
       </Border.Background> 
      </Border> 
      <Grid> 
       <Grid.Background> 
        <LinearGradientBrush StartPoint="0.5,0" EndPoint="0.5,1"> 
         <GradientStop Color="Transparent" Offset="0" /> 
         <GradientStop Color="Black" Offset="1" /> 
         <GradientStop Color="Transparent" Offset="1" /> 
        </LinearGradientBrush> 
       </Grid.Background> 
      </Grid> 
     </Grid> 

    </ControlTemplate> --> 

    <ControlTemplate TargetType="Label" x:Key="generalLabel"> 
     <Grid> 
      <Border BorderBrush="#34B7AEAE" BorderThickness="3" CornerRadius="5"> 
      </Border> 
     </Grid> 
    </ControlTemplate> 

</Window.Resources> 
+2

什么是表名和列名在绑定?你使用的是对象数据源绑定吗? – 2011-03-17 11:32:39

+0

嗨Mamta,你是对的。我将这两个对象绑定为属性。 – 2011-03-17 11:37:22

+0

请添加完整的xaml – 2011-03-17 11:57:45

回答

1

在这种情况下,我建议你创建自定义的控制。它会更优雅。

+0

感谢JohnKZ这是一个很好的建议。我之前没有想到这一点。谢谢 – 2011-03-18 10:06:51

+0

@picmate:完全没有。我喜欢自定义控件的力量)) – 2011-03-18 10:57:47

1

恕我直言,标签的DataContext设置错误,因此没有显示值。

我的猜测是默认DataContext适用于标签在这里,它不包含TableName和ColumnName属性。

看看你的输出窗口,并寻找“错误40,绑定bla bla bla .....”这会给你更多的信息。

要小心,破损的dataBindings不会总是产生异常,它们有时只会在输出窗口中显示警告。

您应该提供有关Label类的更多信息以及如何将dataContext设置为包含所提及属性的对象。

你可能失去了一些东西像

MyCustomLabel.DataContext = MyCustomObjectCOntainingTheProperties;

地方

+0

谢谢大卫。我将数据绑定到datacontext属性,并通过代码将content属性设置为我想要的值。再次感谢。 – 2011-03-18 10:07:34

+0

是否解决了您的问题? – David 2011-03-18 13:07:37

+0

是的,它的确如此。我想稍后检索绑定属性。所以我想保持显示值和界限值分开。这样它的工作。 – 2011-03-21 09:56:34

2

您需要更改绑定如下:

<TextBlock Background="Green" Text="{Binding Source={StaticResource data}, Path=TableName}" Grid.Column="0"/> 
<TextBlock Background="Red" Text="{Binding Source={StaticResource data}, Path=ColumnName}" Grid.Column="1"></TextBlock> 

我试图修改后的代码用一个简单的类具有这两个属性并且它已成功运行。

的ObjectDataProvider的被引用如下:

<ObjectDataProvider x:Key="data" ObjectType="{x:Type local:MyClass}"> 
</ObjectDataProvider> 
+0

嗨Mamta,非常感谢给我一个解决方案。因为我将代码绑定到代码中另一个对象的声明和绑定背后并不会在我的上下文中工作。我尝试了您的解决方案,但无法产生太多结果。然而,谢谢你的答案。 – 2011-03-18 09:13:15