【问题标题】:WPF ListBox binding with conditional display带有条件显示的 WPF ListBox 绑定
【发布时间】:2016-12-15 00:52:22
【问题描述】:

我有一个 WPF 列表框,我将其绑定到联系人对象的集合,类似于

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>

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

【问题讨论】:

    标签: wpf data-binding


    【解决方案1】:

    您需要的是为您的ListBox 进行条件绑定。

    首先为一种联系人类型定义两个DateTemplates:

    <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,您将无法使用它。

    【讨论】:

      【解决方案2】:

      您需要为 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>
      

      【讨论】:

      【解决方案3】:

      使用绑定到 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; }
      }
      

      【讨论】:

        猜你喜欢
        • 2017-03-30
        • 2014-05-17
        • 1970-01-01
        • 2018-12-18
        • 1970-01-01
        • 1970-01-01
        • 2011-01-02
        • 1970-01-01
        相关资源
        最近更新 更多