开发者

Getting value back from ListBox to EventHandler in WP7

In my WP7 application I have ListBox control that binds with List<ItemTemplate> collection. On each ListBoxItem I have Click event which navigates to DisplayItem.xaml. Each ItemTemplate object has Id property which has to be passed to DispalyItem.xaml. I know that I can pass this value from Click EventHandler to DisplayItem.xaml using QueryString but how do I pass it from ListBox item to 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 Hea开发者_开发问答der="edit"/>
                                <toolkit:MenuItem Header="delete"/>
                            </toolkit:ContextMenu>
                        </toolkit:ContextMenuService.ContextMenu>
                    </StackPanel>
                </DataTemplate>
            </ListBox.ItemTemplate>
        </ListBox>

Id property is not mentioned in the above code because I just simply didnt know where to place it. Generally I want to know how can I get Id property back to the click EventHandler ? I'm sorry if this question is basic for you but I'm new to that and i wasn't sure how to google that.


If you're really new to Windows Phone 7, you may want to stop using the "Click" event and instead use the ListBox.SelectionChanged event. If you are bound to List<MyObject>, you could do the following:

In your XAML:

<ListBox SelectionChanged="NavigateToMyDetail" ... >

Then in the code behind, you would have something like this:

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));
   }
}

And you can get that ID with the following code (probably in your "OnNavigatedTo" method).

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

Hope that helps. The other way to try to get it is to give your ListBox a x:Name and then references it in your Click handler like:

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


There is a much simpler solution if you use data binding with an MVVM viewmodel behind it.

Simply bind you view to a property in the view model for the listbox "Source" and then also do the same for the ListBox "SelectedItem" or "SelectedIndex" properties, then you will have all you need accessible where ever you needed.

Only think to be aware of (as I'm uncertain if it ever got fixed) is to fixed the selected index property when an item has been selected, if you do not reset it to -1 then if the user returns to the list they cannot select the same item. (do this in the codebehind for the click event)

Also if you use MVVM and databinding you can enact an action from the change of the Selected item rather than using Code behind to drive the direction, always an option to keep things simple (but not mandatory)


I have also came to my own solution. I'm not sure If its correct bit its certainly solving my problem for now. I found this CommandParameter property of object HyperlinkButton. I bound my MyObject.Id property value to it.

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

Then in my EventHandler i said:

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));
    }

It works as I need it to work but I'm not sure If i should use it in my applications in the future.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜