2011-09-28 8 views
1

내 WP7 애플리케이션에서 컨트롤이 List<ItemTemplate> 컬렉션과 바인딩되어 있습니다. 각 ListBoxItem에는 DisplayItem.xaml으로 이동하는 Click 이벤트가 있습니다. 각 ItemTemplate 개체는 Id 속성을 가지고 있으며 DispalyItem.xaml으로 전달되어야합니다. 나는이 값을 EventHandler에서 DisplayItem.xaml으로 QueryString을 사용하여 전달할 수 있지만 ListBox 항목에서 EventHandler으로 전달하는 방법을 알고 있습니까? 난 그냥 간단하게 배치 할 위치를 몰랐어요 때문에WP7의 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? 미안하지만이 질문이 당신에게 기본이지만 나는 그것에 익숙하지 않고 나는 그 방법을 잘 모르겠습니다.

답변

1

Windows Phone 7을 처음 사용하는 경우 "클릭"이벤트 사용을 중지하고 대신 ListBox.SelectionChanged 이벤트를 사용할 수 있습니다. 당신의 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)); 
    } 
} 

을 그리고 당신이 List<MyObject>에 바인딩하는 경우, 다음을 수행 할 수 다음 코드로 해당 ID를 얻을 수 있습니다 (아마도 "OnNavigatedTo"메소드에서).

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

희망이 있습니다. 다른 방법은 당신의 목록 상자 A를 X 제공하는 것입니다 얻으려고하는 이름을 다음과 같이 사용자의 클릭 핸들러에서 그것을 참조 : 나는 또한 내 자신의 솔루션에 온 한

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

. 올바른 비트가 확실하게 지금 내 문제를 해결한다면 확실하지 않습니다. 개체 HyperlinkButtonCommandParameter 속성을 발견했습니다. 내 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 뷰 모델을 사용하여 데이터 바인딩을 사용하는 경우 훨씬 간단한 솔루션이 있습니다.

"Source"목록에 대한보기 모델의 속성에보기를 바인딩 한 다음 ListBox "SelectedItem"또는 "SelectedIndex"속성에도 동일한 작업을 수행하면 모든 필요한 곳에 액세스 할 수 있습니다. 필요합니다.

항목을 선택하면 선택한 색인 속성을 고정하는 것이고, -1로 재설정하지 않으면 사용자가 반환하는 경우에만 (고정되어 있는지 확실하지 않으므로) 생각합니다. 목록에 동일한 항목을 선택할 수 없습니다.

MVVM과 데이터 바인딩을 사용하는 경우 코드 숨김을 사용하여 방향을 유도하는 대신 항상 항목을 유지하는 옵션을 사용하여 선택 항목을 변경하여 작업을 수행 할 수 있습니다 (예 : 클릭 이벤트에 대한 코드 숨김). 단순 (필수 사항은 아님)