2014-11-22 81 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