So I have a listbox that is being populated by an array and has 25 entries in it. In each row the listbox has, I have a “comments” hyperlink button that has separate functionality than what the listbox does. So, since I’m not technically selecting the listbox item, it doesn’t return an index. Anyways, here’s the code:
<ListBox Name="mainListBox" SelectionChanged="mainListBox_SelectionChanged" Width="460" HorizontalAlignment="Center" VerticalAlignment="Stretch">
<ListBox.ItemTemplate>
<DataTemplate>
<StackPanel Margin="5" Orientation="Horizontal" HorizontalAlignment="Left">
<Image Source="{Binding data.thumbnail}" Margin="5" VerticalAlignment="Top" Width="70" />
<StackPanel Orientation="Vertical">
<TextBlock x:Name="TitleInfo" Text="{Binding data.title}" TextWrapping="Wrap" Foreground="DarkSeaGreen" Width="370" />
<TextBlock x:Name="AuthorInfo" Text="{Binding data.author}" FontSize="15" Margin="2" />
<StackPanel Orientation="Horizontal">
<TextBlock Text="Score:" Margin="2" FontSize="14" />
<TextBlock x:Name="score" Text="{Binding data.score}" FontSize="14" Margin="2"/>
<HyperlinkButton Content="Comments" Click="HyperlinkButton_Click" FontSize="15" x:Name="commentsLink" />
</StackPanel>
</StackPanel>
</StackPanel>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
I want this line:
<HyperlinkButton Content="Comments" Click="HyperlinkButton_Click" FontSize="15" x:Name="commentsLink" />
to give me the index in the code behind the xaml file.
How can I go about doing this?
Thanks
edit:
Here’s the code that is being problematic.
private void HyperlinkButton_Click(object sender, RoutedEventArgs e)
{
var hb = sender as HyperlinkButton;
if (hb != null)
{
var obj = hb.Tag as RootObject;
if (obj != null)
{
MessageBox.Show(obj.data.children[0].data.title, obj.data.children[0].data.author, MessageBoxButton.OK);
}
}
textBlock1.Text = Global.sUrl;
}
Also, here is the code for my object:
public class MediaEmbed
{
public string content { get; set; }
public int? width { get; set; }
public bool? scrolling { get; set; }
public int? height { get; set; }
}
public class Oembed
{
public string provider_url { get; set; }
public string description { get; set; }
public string title { get; set; }
public string url { get; set; }
public string author_name { get; set; }
public int height { get; set; }
public int width { get; set; }
public string html { get; set; }
public int thumbnail_width { get; set; }
public string version { get; set; }
public string provider_name { get; set; }
public string thumbnail_url { get; set; }
public string type { get; set; }
public int thumbnail_height { get; set; }
public string author_url { get; set; }
}
public class Media
{
public string type { get; set; }
public Oembed oembed { get; set; }
}
public class Data2
{
public string domain { get; set; }
public MediaEmbed media_embed { get; set; }
public object levenshtein { get; set; }
public string subreddit { get; set; }
public string selftext_html { get; set; }
public string selftext { get; set; }
public object likes { get; set; }
public bool saved { get; set; }
public string id { get; set; }
public bool clicked { get; set; }
public string title { get; set; }
public Media media { get; set; }
public int score { get; set; }
public bool over_18 { get; set; }
public bool hidden { get; set; }
public string thumbnail { get; set; }
public string subreddit_id { get; set; }
public string author_flair_css_class { get; set; }
public int downs { get; set; }
public bool is_self { get; set; }
public string permalink { get; set; }
public string name { get; set; }
public double created { get; set; }
public string url { get; set; }
public string author_flair_text { get; set; }
public string author { get; set; }
public double created_utc { get; set; }
public int num_comments { get; set; }
public int ups { get; set; }
}
public class Child
{
public string kind { get; set; }
public Data2 data { get; set; }
}
public class Data
{
public string modhash { get; set; }
public Child[] children { get; set; }
public string after { get; set; }
public object before { get; set; }
}
public class RootObject
{
public string kind { get; set; }
public Data data { get; set; }
}
RootObject contains data, which leads to child(an array), which leads to data2 which has all the information I want. Thanks a lot for your help up to this point.
You can use the
Tagparameter. Note that the{Binding}binds the entire object itself.For example,
If collection is your ItemsSource, then inside your DataTemplate , a {Binding} refers to an entire instance of Myobj.
then in your Click Event, simply cast sender to a hyperlink button, and get the Tag.
Check out this cheatsheet on binding. It’s very helpful.
http://www.nbdtech.com/Free/WpfBinding.pdf
Note that this implementation does not use
SelectedIndex– but it doesn’t need to. Since theHyperLinkButtonhas a reference to the object that you are generating theListBoxItemfor, there’s no need for it.Finally, here’s a sample project
https://skydrive.live.com/redir.aspx?cid=ef08824b672fb5d8&resid=EF08824B672FB5D8!352&parid=EF08824B672FB5D8!343