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

3

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

1

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


0

在你的DataTemplate中,将它设置在TextBlock上:

<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>

可以在此处找到有关如何使用触发器的更多信息:WPF指南之旅-第4部分(数据模板和触发器)


我有几个模板控件,每个都加入了它自己的类。tBox1.ItemSource = Class1; tBox2.ItemSource = Class2; tBox3.ItemSource = Class3; - Keepq

0

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

使用标识名称从DataTemplate内部访问控件

可以尝试使用类似以下的内容:

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

但我认为这种方式并不方便,特别是如果有很多控件必须以这种方式进行操作,而且在实时编写代码时无法通过智能感知进行检查。


-1

this.Background=Brushes.White;(假设它是控件的代码后台)?


错误,这会设置控件的背景,而不是文本框。 - Arcturus
将此代码放入您的代码后端将使您的控件背景变为白色。不是tBox的背景,因为它在代码后端中未知,只在DataTemplate中存在。我建议您尝试他发布的代码示例,将颜色更改为红色,看看会发生什么。 - Arcturus
Arcturus,你说得对,但请尝试用更礼貌的方式回复。这样会让人们不愿意回复,比如我! :) - JamesM
当然,詹姆斯,但你可能要先尝试发布一个正确的答案。不要把最低票数当成个人攻击;试着从中学习,并最终成为更好的程序员。 - Arcturus
是的,完全同意。这只是措辞的问题。如果最低票是正确的(你的确是正确的,因为我应该更仔细地阅读而不是快速回答),我不介意。 - JamesM

-1

由于Background是一个依赖属性,您需要使用

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


错误。您可以像他在问题中提到的那样设置属性。 - Arcturus
不,你不能在.cs类中通过代码设置属性。我重新测试了他的代码并确认了这一点。它只能像你建议的那样在 XAML 中设置,而不能通过代码设置。 - Mamta D
是的,正确的。这是因为tBox位于不同的命名空间中->它在DataTemplate中。当您的ItemsSource有3个项目时,您将拥有3个tBox。 - Arcturus

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