我有一个WPF ListBox,我绑定到一组Contact对象,类似于
public class Contact
{
int ContactId { get; set; }
int ContactType { get; set; } // 1 = phone number, 2 = email address
string Value { get; set; }
}
我当前的ListBox绑定是
<ListBox Name="ContactsListBox"
ItemsSource="{Binding Contacts, Mode=Oneway}"
SelectedValuePath="ContactId"
DisplayMemberPath="Value"
</ListBox>
我想将电话号码显示为可点击的文字和电子邮件&#34; mailto:&#34;键入超链接,但我不清楚如何让绑定按我需要的方式工作。
答案 0 :(得分: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>
答案 1 :(得分:0)
您需要的是ListBox
的条件绑定。
首先,您为一种联系人类型定义两个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>
然后您定义ItemTemplate
,DataTrigger
限定为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>
请务必从DisplayMemberPath
删除ListBox
,因为如果设置ItemTemplate
则无法使用{。}}。
答案 2 :(得分: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 class Contact
{
public int ContactId { get; set; }
public int ContactType { get; set; } // 1 = phone number, 2 = email address
public string Value { get; set; }
}