根据数据在列表框Itemtemplate中应用多个datatemplate

本文关键字:应用 datatemplate Itemtemplate 数据 列表 | 更新日期: 2023-09-27 18:01:30

我相信这很简单,但我似乎不知道如何做到这一点。基本上我有一个客户列表,来自一个azure移动服务数据库。到目前为止,一切都很好,但我想根据数据在列表框中设置每个项目的项目模板。我有2个模板,一个为公司和一个人。我的问题是如何应用每一个。

模板
<DataTemplate x:Key="CompanyItemTemplate">
    -------
</DataTemplate>
<DataTemplate x:Key="CustomerItemTemplate">
    -------
</DataTemplate>

代码
CustomerListItems.ItemsSource = customeritems.OrderBy(customer => customer.CustomerName);
foreach (Customers customer in customeritems)
{
    if (customer.Company != "")
    {
        CustomerListItems.ItemTemplate = CompanyItemTemplate;
    }
    else
    {
        CustomerListItems.ItemTemplate = CustomerItemTemplate;
    }
}

根据数据在列表框Itemtemplate中应用多个datatemplate

您可以使用DataTemplateSelector根据绑定到属性的数据动态选择DataTemplate:

示例代码:

public class ImgStringTemplateSelector : DataTemplateSelector
{
  public DataTemplate ImageTemplate { get; set; }
  public DataTemplate StringTemplate { get; set; }
  public override DataTemplate SelectTemplate(object item, 
    DependencyObject container)
  {
    String path = (string)item;
    String ext = System.IO.Path.GetExtension(path);
    if (System.IO.File.Exists(path) && ext == ".jpg")
      return ImageTemplate;
    return StringTemplate;
  }
}
  <Window.Resources>
    <local:RelativeToAbsolutePathConverter x:Key="relToAbsPathConverter" />
    <DataTemplate x:Key="stringTemplate">
      <TextBlock Text="{Binding}"/>
    </DataTemplate>
    <DataTemplate x:Key="imageTemplate">
      <Image Source="{Binding Converter={StaticResource relToAbsPathConverter}}" 
             Stretch="UniformToFill" Width="200"/>
    </DataTemplate>
    <local:ImgStringTemplateSelector 
        ImageTemplate="{StaticResource imageTemplate}" 
        StringTemplate="{StaticResource stringTemplate}" 
        x:Key="imgStringTemplateSelector" />
  </Window.Resources>
  <Grid>
    <ListView ScrollViewer.CanContentScroll="False" 
              ItemsSource="{Binding ElementName=This, Path=PathCollection}" 
              ItemTemplateSelector="{StaticResource imgStringTemplateSelector}">
    </ListView>
  </Grid>
</Window>