2010-06-29 62 views
2

我在寫一個windows-phone 7應用程序。我有一個包含ListBox中包含的TextBlock列表的頁面。我想要的行爲是,單擊其中一個TextBlock(s)時,頁面被重定向到一個不同的頁面,將該TextBlock的Text作爲參數傳遞。在Silverlight中,如何將ListBox項目選擇綁定到Navigate事件?

這是xaml代碼:(這裏我綁定到一個字符串集合,並且事件MouseLeftButtonDown附加到每個TextBlock)。

<ListBox x:Name="List1" ItemsSource="{Binding}"> 
    <ListBox.ItemTemplate> 
     <DataTemplate> 

      <TextBlock MouseLeftButtonDown="List1_MouseLeftButtonDown" Text="{Binding}" 
         FontSize="20"/> 
     </DataTemplate> 
    </ListBox.ItemTemplate> 
</ListBox> 

但這對我來說並不成功。我已經嘗試將MouseLeftButtonDown事件附加到單獨的TextBox(es)或ListBox。我一旦使用NavigationService.Navigate(uri)就會引發異常。應該附加哪個事件?是否應將事件附加到單個項目或整個列表中?

我找到了一種解決此問題的方法,即使用HyperlinkBut​​ton(s)填充ListBox。但是,我想了解爲什麼TextBox方法不起作用。

這是我第一次嘗試使用Silverlight,所以我可能會在這裏丟失一些基本的東西。

回答

0

我會推薦將ListBox的SelectedItem屬性綁定到ViewModel中的一個屬性。然後,在ListBox的SelectedItemChanged事件上,導航到在QueryString上傳遞數據密鑰的相應URL,或者升級到MVVM Light之類的東西,並將實際的SelectedItem對象放在消息總線上以供子窗口使用。我在我的Skydrive上有第二種方法的示例,您可以查看。

HTH!
Chris

1

有幾種方法可以做到這一點,但我會引導您通過最簡單的一個(但不是從架構的角度來看最純粹的)。

基本上你想知道什麼時候ListBox的選擇發生變化。 ListBox引發一個SelectionChanged事件,可以在後面的代碼中監聽。

 <ListBox x:Name="List1" ItemsSource="{Binding}" SelectionChanged="SelectionChangedHandler" SelectionMode="Single" > 
      <ListBox.ItemTemplate> 
       <DataTemplate> 
        <TextBlock Text="{Binding}" FontSize="20"/> 
       </DataTemplate> 
      </ListBox.ItemTemplate> 
     </ListBox> 

然後有一個處理程序是這樣的:

private void SelectionChangedHandler(object sender, SelectionChangedEventArgs e) 
{ 
    IList selectedItems = e.AddedItems; 
    string val = selectedItems.OfType<string>().FirstOrDefault(); 

    NavigationService.Navigate(new Uri(val)); 
} 

有一件事你需要注意的是,列表框支持多重選擇。出於這個原因,事件參數會返回所選項目的列表。爲了簡單起見,我所做的全部都是從這個列表中獲取第一個值,並將其用作導航值。請注意,我還將ListBox的SlectionMode屬性設置爲Single,這將確保用戶只能選擇一個項目。

如果我真的這樣做,我會考慮創建一個TriggerAction tat可以通過xaml連接到一個事件觸發器,它將刪除代碼後面的代碼。如果你是interssetd,請看this link

1

除了Chris和James的回覆,我還補充說您還需要清除事件處理程序中的列表框選擇,否則用戶將無法在列表框中點擊兩次相同的項目(因爲該項目已被選中)。

利用詹姆斯的方法,如下我會改變SelectionChangedHandler()實現:

private void SelectionChangedHandler(object sender, SelectionChangedEventArgs e) 
{ 
    // Avoid entering an infinite loop 
    if (e.AddedItems.Count == 0) 
    { 
     return; 
    } 

    IList selectedItems = e.AddedItems; 
    string val = selectedItems.OfType<string>().FirstOrDefault(); 

    NavigationService.Navigate(new Uri(val)); 

    // Clear the listbox selection 
    ((ListBox)sender).SelectedItem = null; 
} 
相關問題