Возвращение значения из ListBox в EventHandler в WP7 - PullRequest
1 голос
/ 28 сентября 2011

В моем приложении WP7 у меня есть ListBox элемент управления, который связывается с коллекцией List<ItemTemplate>.На каждом ListBoxItem у меня есть Click событие, которое ведет к DisplayItem.xaml.Каждый объект ItemTemplate имеет свойство Id, которое должно быть передано DispalyItem.xaml.Я знаю, что могу передать это значение из Click EventHandler в DisplayItem.xaml, используя QueryString, но как мне передать его из элемента ListBox в 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?Извините, если этот вопрос является базовым для вас, но я новичок в этом, и я не был уверен, как это Google.

Ответы [ 3 ]

1 голос
/ 30 сентября 2011

Существует гораздо более простое решение, если вы используете привязку данных с моделью представления MVVM.

Просто привяжите свой вид к свойству в модели представления для списка «Источник», а затем сделайте то же самое для свойств ListBox «SelectedItem» или «SelectedIndex», тогда у вас будет все, что вам нужно, доступно везде, где вам нужно. .

Подумайте только о том, что нужно знать (поскольку я не уверен, что оно когда-либо было исправлено), чтобы исправить выбранное свойство индекса, когда элемент был выбран, если вы не сбросите его на -1, то если пользователь вернется к В списке они не могут выбрать один и тот же элемент. (сделать это в коде для события click)

Кроме того, если вы используете MVVM и привязку к данным, вы можете выполнить действие из изменения Выбранного элемента, а не с помощью кода позади для определения направления, всегда есть возможность сохранить простоту (но не обязательно)

1 голос
/ 28 сентября 2011

Если вы действительно новичок в 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));
   }
}

И этот идентификатор можно получить с помощью следующего кода (возможно, в вашем методе «OnNavigatedTo»).

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

Надеюсь, это поможет.Другой способ получить его - дать свой список ListBox: Name, а затем сослаться на него в вашем обработчике Click, например:

private void MyClickHandler(object sender, System.Windows.RoutedEventArgs e)
{
   MyObject selectedObject = (MyObject)MyListBoxName.SelectedItem;
}
0 голосов
/ 29 сентября 2011

Я также пришел к своему собственному решению.Я не уверен, если это правильно, это, безусловно, решает мою проблему на данный момент.Я нашел это 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));
    }

Это работает так, как мне нужно, чтобы работать, но яне уверен, если я буду использовать его в своих приложениях в будущем.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...