2013-09-28 31 views
0

我有一个列表框绑定到字符串ObservableCollection带有文件超链接的WPF列表框mvvm

只要ObservableCollection中的某个字符串值包含指向文件的路径,它就会显示为超链接,单击它时应打开该文件。

如何在ItemTemplate中实现此功能?

回答

1

可以使用DataTemplateSelector

public class HyperlinkDataTemplateSelector : DataTemplateSelector 
{ 
     public DataTemplate RegularTemplate { get; set; } 

     public DataTemplate HyperlinkTemplate { get; set; } 

     public override System.Windows.DataTemplate SelectTemplate(object item, System.Windows.DependencyObject container) 
     { 
      var str = item as string; 

      // Check if str contains path and return the dataTemplate accordingly 

      return // Either RegularTemplate or HyperlinkTemplate 
     } 
} 

在XAML实现这一

<local:HyperlinkDataTemplateSelector x:Key="itemTemplateSelector"> 
     <local:HyperlinkDataTemplateSelector.RegulatTemplate> 
      <DataTemplate> 
       <TextBlock Text="{Binding Path=YourProperty}"/> 
      </DataTemplate> 
     </local:HyperlinkDataTemplateSelector.RegularTemplate> 
     <local:HyperlinkDataTemplateSelector.HyperlinkTemplate> 
      <DataTemplate> 
        <TextBlock> 
         <Hyperlink NavigateUri="{Binding Path=YourProperty}"> 
          <TextBlock Text="{Binding Path=YourProperty}" /> 
         </Hyperlink> 
        </TextBlock> 
      </DataTemplate> 
     </local:HyperlinkDataTemplateSelector.HyperlinkTemplate> 
</local:HyperlinkDataTemplateSelector> 

在你ListBox声明中使用您的DataTemplateSelector

<ListBox ItemsSource="{Binding Path=YourCollection}" ItemTemplateSelector="{StaticResource itemTemplateSelector}"> 

希望这有助于

+0

感谢Omribitan- itemssource是一个可观察的集合。另外在observablecollection中会有很多超链接,所以NavigateUri应该指向包含路径的文本?并且不需要在Regulartemplate中有一个文本块绑定到一个属性? – user1570697

+0

@ user1570697是:) –