2010-09-08 80 views
3

错误:名称'tBox'在当前上下文中不存在。错误:名称'tBox'在当前上下文中不存在

XAML:

<ItemsControl Name="itemsControl"> 
    <ItemsControl.Template> 
     <ControlTemplate> 
      <WrapPenel> 
       <ItemsPresenter/> 
      </WrapPenel> 
     </ControlTemplate> 
    </ItemsControl.Template> 
    <ItemsControl.ItemTemplate> 
     <DataTemplate> 
      <TextBlock Name="tBox" Text="{Binding Name}"></TextBlock> 
     </DataTemplate> 
    </ItemsControl.ItemTemplate> 
</ItemsControl> 

C#:

tBox.Background=Brushes.White; // Error: The name 'tBox' does not exist in the current context. 

如何访问控制?

回答

-1

this.Background = Brushes.White;(假设它的代码在控制之后)?

+0

错误,这设置了控件的背景,而不是文本框 – Arcturus 2010-09-08 09:33:25

+0

将此代码置于您的代码后面会将背景设置为您的控件的白色。不是tBox,因为它在后面的代码中是不知道的,只能在DataTemplate中。我建议你尝试他发布的代码示例,将你的颜色改为红色,然后看看会发生什么。 – Arcturus 2010-09-08 13:01:58

+0

大角星,你是对的,但请尽量多与礼貌的结构有礼貌。让人们试图回复,就像我一样! :) – JamesM 2010-09-08 13:04:31

-1

由于背景是一个依赖属性,你将不得不使用

tBox.SetValue(BackgroundProperty,新SolidBrush(Color.White));

+0

错误..您可以设置像他在问题 – Arcturus 2010-09-08 09:33:08

+0

中提到的属性不,您不能通过代码在the.cs类中设置属性。 我再次测试了他的代码并确认了这一点。它只能像您建议的那样在XAML中设置,而不能通过代码设置。 – 2010-09-09 03:50:18

+0

是的。因为tBox驻留在不同的名称范围内 - >它在DataTemplate中。当你的ItemsSource有3个项目时,你将有3个tboxes – Arcturus 2010-09-09 07:48:54

1

您命名为tBox的TextBlock位于DataTemplate中。模板内的控件位于不同的名称范围内,因此您无法通过其名称在代码隐藏中访问它。我不确定,但可以通过ItemTemplate属性获取它并将其转换为TextBlock。或者,您可以在代表背景的代码中添加属性,并在TextBlock的Background属性上使用绑定。希望这可以帮助。

0

将其设置在TextBlock,在DataTemplate

<DataTemplate> 
    <TextBlock Name="tBox" Background="White" Text="{Binding Name}"></TextBlock> 
</DataTemplate> 

或者,如果你希望只设置Background在一定的条件下,可以考虑使用Triggers:如何

<DataTemplate> 
    <TextBlock Name="tBox" Text="{Binding Name}"></TextBlock> 
    <DataTemplate.Triggers> 
     <Trigger SourceName="tBox" Property="IsMouseOver" Value="True"> 
      <Setter TargetName="tBox" Property="Background" Value="White" /> 
     </Trigger> 
    </DataTemplate.Triggers> 
</DataTemplate> 

更多信息使用触发器可以在这里找到:A Guided Tour of WPF - Part 4 (Data Templates and Triggers)

+0

我有几个模板控件,每个都加入他的班级。 tBox1.ItemSource = Class1; tBox2.ItemSource = Class2; tBox2.ItemSource = Class3; – Keepq 2010-09-08 12:24:02

+0

我不明白..你可以发布多一点的代码? – Arcturus 2010-09-08 12:37:15

0

我没有尝试,但也许答案这里的工作原理:

Access a control from within a DataTemplate with its identifying name

使用类似:

var tbUserIcon= (TextBlock)checkBox.Template.FindName("tbUserIcon", checkBox); 

但我认为这种方式并不方便可言,尤其是如果有大量的控制必须这样做,这样一来,和实时编写代码时无法通过intellisense进行检查。

相关问题