2016-12-14 59 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; } 
}