错误:当前上下文中不存在名称“tBox”

时间:2010-09-08 08:46:05

标签: c# wpf xaml

错误:当前上下文中不存在名称“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.

如何访问控件?

5 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

TextBlock:{/ p>中的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)

答案 2 :(得分:0)

我没有尝试,但也许这里的答案有效:

Access a control from within a DataTemplate with its identifying name

使用类似的东西:

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

但我认为这种方式根本不方便,特别是如果有很多控件必须这样做,并且在实时编写代码时无法通过intellisense进行检查。

答案 3 :(得分:-1)

this.Background = Brushes.White; (假设其代码在控件后面)?

答案 4 :(得分:-1)

由于Background是依赖属性,因此您必须使用

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