2016-12-14 20 views
0

と結合し、私は結合WPFのListBoxの条件付き表示

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

私の現在のListBoxに似て私は連絡先オブジェクトのコレクションにバインドしていますWPFのListBoxコントロールを、私はしたいと思います

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

されてい電話番号をテキストと電子メールで表示し、クリック可能な "mailto:"というハイパーリンクを表示しますが、必要な方法でバインディングを取得する方法は不明です。

答えて

0

必要なものあなたのListBoxのための結合条件付きです。

まずあなたが一つの接触型の2つのDateTemplateのそれぞれを定義します。

<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> 

そしてあなたはContactTypeプロパティに囲まDataTriggerItemTemplateを定義します。

<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-e-mail-handler-in-wpf-application – 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> 

あなたがリンクは、Webブラウザで開くことにしたい場合は、ここで示唆したように、あなたがハイパーリンクのRequestNavigateイベントを処理する必要がありますExample using Hyperlink in WPF 。また

publicとしてあなたの特性を定義していることを確認してください:

public class Contact 
{ 
    public int ContactId { get; set; } 
    public int ContactType { get; set; } // 1 = phone number, 2 = email address 
    public string Value { get; set; } 
} 
関連する問題