2014-11-22 61 views
1

我正在开发一个本地项目,并且遇到一些问题。使用ObservableCollection WPF模板

我想创造一些结果有3个字符串(其中1是一个超链接)和图象的模板,他们来为绑定到的ItemSource结果类型的一个ObservableCollection。

public TestClass { 
    public string Title { get; set; } 
    public string Description { get; set; } 
    public string Link { get; set; } 
    public BitmapImage Thumbnail { get; set; } 
} 

所以,我想表明在WPF的结果,我想用每个项目模板,并显示在一个StackPanel(或ListView)。

我试图与ListView的,但你可以做的唯一的事情就是选择整个项目,但我也希望链接可以点击。

我的问题是:我怎么可以创建一个模板使用的每个项目,然后在列表1个字符串是可以点击添加它们?

+0

你确定你不只是误点击链接?它是否设置为可见的命中测试?点击事件应该打到那个控件* first *。 – BradleyDotNET 2014-11-22 00:32:36

+0

用'ItemsControl'替换'ListView'并使用你的自定义模板。将ItemsControl的ItemsSource绑定到你的Collection。 – Unflux 2014-11-22 00:51:00

回答

0

正如Unflux提到的,这是做一个好办法。至于可点击的链接,请使用Hyperlink控件,如下所示。

<ItemsControl ItemsSource="{Binding Persons}"> 
    <ItemsControl.ItemTemplate> 
     <DataTemplate> 
      <Grid> 
       <Grid.RowDefinitions> 
        <RowDefinition /> 
        <RowDefinition /> 
       </Grid.RowDefinitions> 
       <Grid.ColumnDefinitions> 
        <ColumnDefinition Width="Auto" /> 
        <ColumnDefinition Width="Auto" /> 
        <ColumnDefinition Width="Auto" /> 
       </Grid.ColumnDefinitions> 

       <TextBlock Text="{Binding FirstName}" Grid.Row="0" Grid.Column="0" /> 
       <TextBlock Text="{Binding LastName}" Grid.Row="0" Grid.Column="1" /> 
       <TextBlock Text="{Binding Age}" Grid.Row="0" Grid.Column="2" /> 
       <TextBlock Grid.Row="1" Grid.Column="0" Grid.ColumnSpan="3"> 
        <Hyperlink NavigateUri="{Binding BlogAddress}" Click="Hyperlink_OnClick"> 
         <TextBlock Text="{Binding BlogAddress}" /> 
        </Hyperlink> 
       </TextBlock>       
      </Grid> 
     </DataTemplate> 
    </ItemsControl.ItemTemplate> 
</ItemsControl> 

和代码隐藏

private void Hyperlink_OnClick(object sender, RoutedEventArgs e) 
{ 
    var link = sender as Hyperlink; 
    Process.Start(link.NavigateUri.ToString()); 
} 

结果

screenshot of demo

你可能会想样式有点,也许应用不同的ItemsPanel真正定制的外观你的收藏。您还可以用滚动装饰ItemsControl

0

感谢将ItemsControl与其模板一起使用的想法。但超链接,我使它与Click属性,并给它一个:

public ICommand RunHyperlink { 
    get { 
     return new ActionCommand(this.ButtonClick); 
    } 
} 

private void ButtonClick() { 
     Process.Start(new ProcessStartInfo(this.Link)); 
} 
+0

是的,如何做到这一点肯定有更多的方法。由于这是你的第一个问题,我请你不要忘记标记一个答案,帮助你(在这种情况下,我的)通过点击旁边的分数下拉控制下的复选标记来接受。谢谢,欢迎。 – 2014-11-22 19:05:34