Привязка к ListBox с интерактивными ссылками - PullRequest
1 голос
/ 19 декабря 2010

Я работаю над своим первым приложением WPF, и оно довольно крутое.Однако сегодня я столкнулся с кирпичной стеной.

Мое приложение выступает в роли поисковика в Интернете - посещает поисковые системы и получает ссылки.Я хотел бы отображать ссылки в интерактивном формате.Я решил связать получившиеся string[] ссылок с ListBox и поместить туда Hyperlink.После некоторого поиска в Google вот что я придумал:

<ListBox Height="200" ItemsSource="{Binding Path=UrlsFound, Mode=OneWay}" Name="listBox1" Width="727">
    <ListBox.Resources>
        <DataTemplate DataType="String">
            <TextBlock>
                <Hyperlink NavigateUri="{Binding}" RequestNavigate="Hyperlink_RequestNavigate">
                    <TextBlock Text="{Binding}" />
                </Hyperlink>
            </TextBlock>
        </DataTemplate>
    </ListBox.Resources>
</ListBox>

и в коде:

private void Hyperlink_RequestNavigate(object sender, RequestNavigateEventArgs e)
{
    Process.Start(new ProcessStartInfo(e.Uri.AbsoluteUri));
    e.Handled = true;
}

Я нашел этот код RequestNavigate в нескольких местах в Интернете.

Так что все в порядке, и в списке есть все ссылки, но они не кликабельны.Я добавил точку останова на RequestNavigate, которая не ударилась (тоже попробовал двойной щелчок) и даже попытался добавить обработчик Click.Что я делаю не так?

1 Ответ

6 голосов
/ 19 декабря 2010

Мне кажется, проблема в том, что ваш DataTemplate никак не связан с вашими элементами списка.Вы должны указать ListBox.ItemTemplate вместо простого определения DataTemplate в разделе ресурсов (он не работает как стиль без ключа).

<ListBox Height="200" ItemsSource="{Binding Path=UrlsFound, Mode=OneWay}" Name="listBox1" Width="727">
    <ListBox.ItemTemplate>
        <DataTemplate DataType="String">
            <TextBlock>
                <Hyperlink NavigateUri="{Binding}" RequestNavigate="Hyperlink_RequestNavigate">
                    <TextBlock Text="{Binding}" />
                </Hyperlink>
            </TextBlock>
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>
...