2011-06-10 89 views
1

我正在構建一個小型Windows Phone應用程序,其中有一個數據綁定ListBox作爲主要控件。 DataTemplate這個ListBox是一個數據綁定ItemsControl元素,它顯示了一個人在一個ListBox元素上點擊的時間。如何訪問Windows Phone中的ListBox中的內部ItemsControl Silverlight

目前,我通過遍歷應用程序的可視化樹並在列表中引用它,並通過SelectedIndex屬性獲取所選項目來訪問它。

有沒有更好或更有效的方法?

這一個工程目前,但我怕如果它將保持有效的情況下,更大的名單。

感謝

回答

2

你試過接線SelectionChanged事件ListBox的?

<ListBox ItemsSource="{Binding}" SelectionChanged="ListBox_SelectionChanged"> 
    <ListBox.ItemTemplate> 
     <DataTemplate> 
      <!-- ... --> 
     </DataTemplate> 
    </ListBox.ItemTemplate> 
</ListBox> 

有了這個後面的代碼:

private void ListBox_SelectionChanged(object sender, SelectionChangedEventArgs e) 
{ 
    ListBox listBox = sender as ListBox; 

    // nothing selected? ignore 
    if (listBox.SelectedIndex != -1) 
    { 
     // something is selected 
    } 

    // unselect the item so if they press it again, it takes the selection 
    listBox.SelectedIndex = -1; 
} 
+1

我有,但這隻給我選擇的索引,而不是DataTemplate的內部項目。 – 2011-06-11 11:02:00

0
ListBoxItem item = this.lstItems.ItemContainerGenerator.ContainerFromIndex(yourIndex) as ListBoxItem; 

然後你可以使用VisualTreeHelper類來獲得子項目

var containerBorder = VisualTreeHelper.GetChild(item, 0) as Border; 
var contentControl = VisualTreeHelper.GetChild(containerBorder, 0); 
var contentPresenter = VisualTreeHelper.GetChild(contentControl, 0); 
var stackPanel = VisualTreeHelper.GetChild(contentPresenter, 0) as StackPanel; // Here the UIElement root type of your item template, say a stack panel for example. 
var lblLineOne = stackPanel.Children[0] as TextBlock; // Child of stack panel 
lblLineOne.Text = "Some Text"; // Updating the text. 

另一種選擇是使用的服務WP7工具包中提供的GestureServices類。

你需要一個GestureListner添加到您的DataTemplate的根元素,像這樣:

  <ListBox.ItemTemplate> 
       <DataTemplate> 
        <StackPanel> 
         <Controls:GestureService.GestureListener> 
          <Controls:GestureListener Tap="GestureListener_Tap" /> 
         </Controls:GestureService.GestureListener> 
         <TextBlock x:Name="lblLineOne" Text="{Binding LineOne}" /> 
         <TextBlock Text="{Binding LineTwo}" /> 
        </StackPanel> 
       </DataTemplate> 
      </ListBox.ItemTemplate> 

而在GestureListener_Tap事件處理程序,使用此片段。

private void GestureListener_Tap(object sender, GestureEventArgs e) 
    { 
     var itemTemplateRoot = sender as StackPanel; 
     var lbl1 = itemTemplateRoot.Children[0] as TextBlock; 
     MessageBox.Show(lbl1.Text); 
    } 

我不知道該怎麼GestureListner內部識別被竊聽的項目,但我想它使用了VisualTreeHelper,至少這種方法更簡潔。

+0

這基本上是一個遍歷樹的類似方法,我只會在有人點擊某個項目時才這樣做? – 2011-06-11 11:00:51

+0

所以你需要使用工具包中的GestureListner類來處理被選中的項目,我在上面創建了一個小代碼片段,希望這有助於 – Waleed 2011-06-11 17:25:36

相關問題