2016-12-14 60 views
0

结合我有一个WPF列表框,我绑定到联系对象的集合,类似于WPF列表框与条件显示

public class Contact 
{ 
    int ContactId { get; set; } 
    int ContactType { get; set; } // 1 = phone number, 2 = email address 
    string Value { get; set; } 
} 

我现在的列表框绑定

<ListBox Name="ContactsListBox" 
    ItemsSource="{Binding Contacts, Mode=Oneway}" 
    SelectedValuePath="ContactId" 
    DisplayMemberPath="Value" 
</ListBox> 

我想将电话号码显示为可点击的“mailto:”类型超链接的文本和电子邮件,但我不清楚如何让绑定以我需要的方式工作。

回答

0

你需要的是有条件的结合为您ListBox

首先定义两个DateTemplate s分别为一个接触式:

<ListBox.Resources> 
    <DataTemplate x:Key="PhoneTemplate"> 
     <TextBlock Text="{Binding Value}" /> 
    </DataTemplate> 
    <DataTemplate x:Key="MailTemplate"> 
     <TextBlock> 
      <Hyperlink NavigateUri="{Binding Value}"> 
       <TextBlock Text="{Binding Value}" /> 
      </Hyperlink> 
     </TextBlock> 
    </DataTemplate> 
</ListBox.Resources> 

然后定义ItemTemplateDataTrigger一定到ContactType属性:

<ListBox.ItemTemplate> 
    <DataTemplate> 
     <ContentControl Content="{Binding}"> 
      <ContentControl.Style> 
       <Style TargetType="ContentControl"> 
        <Style.Triggers> 
         <DataTrigger Binding="{Binding ContactType}" Value="1"> 
          <Setter Property="ContentTemplate" Value="{StaticResource PhoneTemplate}" /> 
         </DataTrigger> 
         <DataTrigger Binding="{Binding ContactType}" Value="2"> 
          <Setter Property="ContentTemplate" Value="{StaticResource MailTemplate}" /> 
         </DataTrigger> 
        </Style.Triggers> 
       </Style> 
      </ContentControl.Style> 
     </ContentControl> 
    </DataTemplate> 
</ListBox.ItemTemplate> 

务必从ListBox删除DisplayMemberPath,因为如果您设置了ItemTemplate,则无法使用它。

0

您需要为ListBox编写您的ItemTemplate。

<Window.Resources> 
<DataTemplate x:Key="MyTemplate"> 

    <StackPanel Orientation="Horizontal"> 
      <TextBlock Text="{Binding Value }"></TextBlock> 
      <TextBlock>   
       <Hyperlink NavigateUri="{Binding YourString}" RequestNavigate="OnNavigate">Click here</Hyperlink> 
      </TextBlock> 
    </StackPanel> 

<ListBox Name="ContactsListBox" 
     ItemsSource="{Binding Contacts}" 
     ItemTemplate="{StaticResource MyTemplate}" 
</ListBox> 
+0

如何浏览:HTTP://stackoverflow.com/questions/23020377/link-to-open-new-email-message-in -default-电子邮件的处理功能于WPF应用程序 – leapold

0

用结合到ContactType属性DataTrigger定义一个ItemTemplate:

<ListBox Name="ContactsListBox" ItemsSource="{Binding Contacts, Mode=Oneway}" SelectedValuePath="ContactId"> 
<ListBox.ItemTemplate> 
    <DataTemplate> 
     <Grid> 
      <TextBlock x:Name="phone" Text="{Binding Value}" /> 
      <TextBlock x:Name="email" Visibility="Collapsed"> 
         <Hyperlink NavigateUri="{Binding Value}"> 
          <Run Text="{Binding Value}" /> 
         </Hyperlink> 
      </TextBlock> 
     </Grid> 
     <DataTemplate.Triggers> 
      <DataTrigger Binding="{Binding ContactType}" Value="2"> 
       <Setter TargetName="email" Property="Visibility" Value="Visible" /> 
      </DataTrigger> 
     </DataTemplate.Triggers> 
    </DataTemplate> 
</ListBox.ItemTemplate> 
</ListBox> 

如果你想链接到一个网页浏览器,你应该处理的超链接的RequestNavigate事件打开如下建议:Example using Hyperlink in WPF

另外,还要确保你定义属性市民:

public class Contact 
{ 
    public int ContactId { get; set; } 
    public int ContactType { get; set; } // 1 = phone number, 2 = email address 
    public string Value { get; set; } 
}