Получение индекса по гиперссылке внутри списка - PullRequest
0 голосов
/ 21 декабря 2011

Итак, у меня есть список, который заполняется массивом и в нем 25 записей. В каждой строке списка есть кнопка гиперссылки «Комментарии», которая отличается от функций списка. Итак, поскольку я технически не выбираю элемент списка, он не возвращает индекс. В любом случае, вот код:

<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>

Я хочу эту строку:

<HyperlinkButton Content="Comments" Click="HyperlinkButton_Click" FontSize="15" x:Name="commentsLink" />

чтобы дать мне индекс в коде файла xaml.

Как мне это сделать?

Спасибо

редактирование: Вот код, который является проблематичным.

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;
    }

Также вот код для моего объекта:

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 содержит данные, которые ведут к дочернему элементу (массиву), который ведет к данным data2, которые содержат всю необходимую информацию. Большое спасибо за вашу помощь до этого момента.

1 Ответ

1 голос
/ 21 декабря 2011

Вы можете использовать параметр Tag.Обратите внимание, что {Binding} связывает весь объект целиком.

Например,

class Myobj
{
   string param1 { get; set; } 
   string param2 { get; set; }
}

ObservableCollection<Myobj> collection;

Если коллекцией является ваш ItemsSource, то внутри вашего DataTemplate {Binding} ссылается на весь экземплярof Myobj.

<HyperlinkButton Content="Comments" Click="HyperlinkButton_Click" FontSize="15" x:Name="commentsLink" Tag="{Binding}" />

затем в вашем событии Click просто приведите отправителя к кнопке гиперссылки и получите тег.

...
var hb = sender as HyperLinkButton;
if (hb != null)
  {
     var obj = hb.Tag as Myobj;
     if (obj != null)
     { 

     }
  }
...

Ознакомьтесь с этим списком при связывании.Это очень полезно.

http://www.nbdtech.com/Free/WpfBinding.pdf

Обратите внимание, что эта реализация не использует SelectedIndex - но в этом нет необходимости.Поскольку HyperLinkButton имеет ссылку на объект, для которого вы генерируете ListBoxItem, в этом нет необходимости.

Наконец, вот пример проекта

https://skydrive.live.com/redir.aspx?cid=ef08824b672fb5d8&resid=EF08824B672FB5D8!352&parid=EF08824B672FB5D8!343

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