2010-09-08 88 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進行檢查。

相關問題