2013-03-19 78 views
1

我有一個「SmartText」項目的列表框,它基本上是鏈接對象,具有標題,描述和url的屬性。我正在嘗試使XAML中的Grid面板可點擊,以便在整個Grid上點擊導航到該URL。我如何訪問URL屬性以便我可以導航到它?如何訪問XAML中ListBox中的項目的屬性?

<controls:Pivot VerticalAlignment="Stretch" 
       HorizontalAlignment="Stretch" 
       Margin="0,0,0,0" 
       x:Name="PivotRoot" 
       Title="{Binding SmartTextStateModel.Title}" 
       SelectionChanged="Pivot_SelectionChanged" 
       Background="{StaticResource PhoneBackgroundBrush}"> 
    <controls:PivotItem Header="{Binding Path=Labels.SmartTextBingHeaderLabel, Source={StaticResource Translations}}" Tag="bingsearch"> 
     <ListBox ItemsSource="{Binding SmartTextStateModel.BingItemResults}"> 
      <ListBox.ItemTemplate> 
       <DataTemplate> 
        <Grid Tap="SmartTextElement_Tap"> 
         <Grid.RowDefinitions> 
          <RowDefinition Height="*"/> 
          <RowDefinition Height="Auto"/> 
          <RowDefinition Height="Auto"/> 
         </Grid.RowDefinitions> 
         <TextBlock Grid.Row="0" FontSize="40" Text="{Binding Path=Title}" /> 
         <TextBlock Grid.Row="1" TextWrapping="Wrap" FontSize="18.667" Foreground="{StaticResource PhoneDisabledBrush}" 
            TextTrimming="WordEllipsis" MaxHeight="100" Text="{Binding Path=Description}"/> 
         <TextBlock Grid.Row="2" Foreground="{StaticResource PhoneAccentBrush}" Text="{Binding Path=Url}"/> 
        </Grid> 
       </DataTemplate> 
      </ListBox.ItemTemplate> 
     </ListBox> 
    </controls:PivotItem> 

    ... 

</controls:Pivot> 

和類定義

public class SmartTextItemModel : BaseModel 
{ 
    private string _title; 
    private string _description; 
    private string _url; 

    /// <summary> 
    /// The title of the linked page (Large text) 
    /// </summary> 
    public string Title 
    { 
     get { return _title; } 
     set 
     { 
      if (_title != value) 
      { 
       _title = value; 
       NotifyPropertyChanged("Title"); 
      } 
     } 
    } 

    /// <summary> 
    /// Description of the page (smaller text) 
    /// </summary> 
    public string Description 
    { 
     get { return _description; } 
     set 
     { 
      if (_description != value) 
      { 
       _description = value; 
       NotifyPropertyChanged("Description"); 
      } 
     } 
    } 

    /// <summary> 
    /// Url of the page 
    /// </summary> 
    public string Url 
    { 
     get { return _url; } 
     set 
     { 
      if (_url != value) 
      { 
       _url = value; 
       NotifyPropertyChanged("Url"); 
      } 
     } 
    } 

    public SmartTextItemModel(string _t, string _d, string _u) 
    { 
     this._title = _t; 
     this._description = _d; 
     this._url = _u; 
    } 
} 

當然在cs文件的事件處理程序是這樣的:

private void SmartTextElement_Tap(object sender, System.Windows.Input.GestureEventArgs e) 
{ 
    ... ? 
    // Navigate to url... 
} 

注:這是最接近的StackOverflow問題我的: How to get the listbox item's properties after event "tap",但它仍然沒有幫助。

+0

我不明白你的問題。您在ViewModel中具有URL屬性。只要從那裏得到它。 – 2013-03-19 21:00:26

+0

事件處理程序中的發件人是一個Grid面板元素。我已經嘗試了多種方式從引用到Grid面板到達元素的url,但沒有任何工作。列表框中的每個項目都是不同的SmartText鏈接。 – Flames 2013-03-19 21:07:26

+0

'Tap'是否也在ListBox中選擇Item,你可以綁定到SelectedItem並在你的處理器中使用它 – 2013-03-19 21:19:00

回答

2

Grid位於ListBoxItemTemplate之內。這意味着Grid.DataContext財產將是您的SmartTextItemModel類的一個實例:

private void SmartTextElement_Tap(object sender, System.Windows.Input.GestureEventArgs e) 
{ 
    var grid = sender as Grid; 
    if (grid == null) 
     return; 

    var item = grid.DataContext as SmartTextItemModel; 
    if (item == null) 
     return; 

    item.// Navigate to url... 
} 
+0

謝謝,我沒有意識到DataContext屬性。我想我需要訪問TextBlock子元素,然後以某種方式獲取Url。 – Flames 2013-03-19 21:25:45

相關問題