2011-09-28 61 views
1

在我的WP7應用程序中,我有ListBox控件與List<ItemTemplate>集合綁定。在每個ListBoxItem我有Click事件導航到DisplayItem.xaml。每個ItemTemplate對象具有Id屬性,必須將其傳遞給DispalyItem.xaml。我知道我可以通過使用QueryString從點擊EventHandlerDisplayItem.xaml這個值,但我怎麼把它從ListBox項目傳遞到EventHandler從ListBox獲取值到WP7中的EventHandler

<ListBox x:Name="listBoxItems"> 
      <ListBox.ItemTemplate> 
       <DataTemplate> 
        <StackPanel Orientation="Horizontal"> 
         <Ellipse Fill="red" Width="30" Height="30"></Ellipse> 
         <StackPanel Orientation="Horizontal"> 
          <CheckBox IsChecked="{Binding Status}" FontSize="35" /> 
         </StackPanel> 
         <StackPanel Orientation="Horizontal"> 
          <HyperlinkButton Content="{Binding ItemContent}" Name="itemButton" Click="itemButton_Click"/> 
         </StackPanel> 
         <toolkit:ContextMenuService.ContextMenu> 
          <toolkit:ContextMenu> 
           <toolkit:MenuItem Header="edit"/> 
           <toolkit:MenuItem Header="delete"/> 
          </toolkit:ContextMenu> 
         </toolkit:ContextMenuService.ContextMenu> 
        </StackPanel> 
       </DataTemplate> 
      </ListBox.ItemTemplate> 
     </ListBox> 

Id屬性沒有在上面的代碼中提到的,因爲我只是單純地不知道在何處放置它。一般我想知道如何才能將Id財產返回到點擊EventHandler?我很抱歉,如果這個問題是你的基本問題,但我是新手,我不知道如何谷歌。

回答

1

如果您對Windows Phone 7非常陌生,可能需要停止使用「Click」事件,而是使用ListBox.SelectionChanged事件。如果你一定要List<MyObject>,你可以做到以下幾點:

在您的XAML:

<ListBox SelectionChanged="NavigateToMyDetail" ... > 

然後在後面的代碼,你有這樣的事情:

private void NavigateToMyDetail(object sender, SelectionChangedEventArgs e) 
{ 
    // Make sure that the ListBox change wasn't due to a deselection 
    if(e.AddedItems != null && e.AddedItems.Count == 1) 
    { 
     MyObject selectedItem = (MyObject)e.AddedItems[0]; 
     // Now you have access to all your MyObject properties 
     // and you can pass that to your new page as a parameter 
     NavigationService.Navigate(new Uri("DisplayItem.xaml?ItemID=" + selectedItem.id.ToString(), UriKind.Relative)); 
    } 
} 

你可以用下面的代碼獲取該ID(可能在您的「OnNavigatedTo」方法中)。

string myItemID = null; 
if(this.NavigationContext.QueryString.ContainsKey("ItemID")) 
    myItemID = NavigationContext.QueryString["ItemID"]; 

希望有所幫助。另一種方式來設法得到它就是給你一個列表框X:名稱,然後像引用您的Click處理程序:

private void MyClickHandler(object sender, System.Windows.RoutedEventArgs e) 
{ 
    MyObject selectedObject = (MyObject)MyListBoxName.SelectedItem; 
} 
0

我也來到了自己的解決方案。我不確定如果它的正確位現在解決了我的問題。 我發現這個CommandParameter對象HyperlinkButton的性質。我將我的MyObject.Id屬性值綁定到它。

<HyperlinkButton Content="{Binding ItemContent}" Click="itemButton_Click" CommandParameter="{Binding Id}" /> 

然後在我的EventHandler我說:

private void itemButton_Click(object sender, RoutedEventArgs e) 
    { 
     HyperlinkButton butt = sender as HyperlinkButton; 
     NavigationService.Navigate(new Uri("/ViewItem.xaml?itemId=" + butt.CommandParameter.ToString(), UriKind.Relative)); 
    } 

它的工作原理,因爲我需要它來工作,但我不知道我是否應該在將來使用它在我的應用程序。

1

如果您使用數據綁定以及MVVM視圖模型,則有一種更簡單的解決方案。

只需將視圖綁定到視圖模型中用於列表框「源」的屬性,然後對列表框「SelectedItem」或「SelectedIndex」屬性也執行相同操作,那麼您將擁有所有需要訪問的位置需要。

只有認識到(因爲我不確定它是否得到修復)是在選擇某個項目時修復了選定的索引屬性,如果您沒有將其重置爲-1,那麼如果用戶返回到列表他們不能選擇相同的項目。(在單擊事件的代碼隱藏中執行此操作)

此外,如果您使用MVVM和數據綁定,則可以從Selected項目的更改中制定操作,而不是使用後面的代碼來驅動方向,始終選擇保留事項簡單(但不是強制性的)