2014-12-03 76 views
0

我有一个由项目填充的列表框。每个项目包含一个对象如下:根据数据不同的列表框项目样式WP 8.1

public Contact(int idContact, string pseudo, string prenom, string nom, string numero, bool isOuter) 
    { 
     this.IdContact = idContact; 
     this.Pseudo = pseudo; 
     this.Prenom = prenom; 
     this.Nom = nom; 
     this.NumerosTel = numero; 
     this.IsOuter = isOuter; 
    } 

现在我想根据IsOuter值到不同的样式应用到这些项目,因为它是一个布尔值。我听说过DataTemplateSelector但无法真正弄清楚它是如何工作的....有人可以告诉我该怎么做吗?

回答

1

首先,您创建一个DataTemplateSelector这样的:

public class MyTemplateSelector : DataTemplateSelector { 
    protected override DataTemplate SelectTemplateCore(object item, DependencyObject container) { 
     var contact = (Contact)item; 

     if (contact.IsOuter == true) { 
      return (DataTemplate)Application.Current.Resources["DataTemplate1Name"]; 
     } else { 
      return (DataTemplate)Application.Current.Resources["DataTemplate2Name"]; 
     } 
    } 
} 

在这段代码中,的DataTemplates应在App.xaml中。基本上,该方法必须将您想要的DataTemplate作为DataTemplate对象返回。你将如何得到这个对象完全取决于你。

,你需要设置ListBox这样的ItemTemplateSelector

​​

就是这样。现在不同的项目将有不同的模板,基于IsOuter属性。

的几点思考

您可能希望有更多的可重复使用的模板选择。例如,您可能有一个接口,其中一个DataTemplate属性,在SelectTemplateCore中检查项目是否实现接口,如果是 - 返回该属性的值。

无论如何,上面的代码现在应该可以工作,如果将来需要更多的代码,你会找出最方便的方式来编写/使用它们。 :)

+0

感谢您的答案和建议!根据上面的代码,作为资源,我需要在我的页面资源中有2个名为DataTemplate1和DataTemplate2的DataTemplate正确吗? – 2014-12-03 19:27:54

+1

我修改了一下我的答案。您应该将这两个模板放在App.xaml中,或调整代码以获取当前页面的资源,或者将两个模板的属性添加到MyTemplateSelector类中,并在创建实例时对其进行设置。但App.xaml是最简单的。 :) – yasen 2014-12-03 19:45:05

+0

非常感谢!很好的答案!它效果很好:) – 2014-12-03 20:50:16

相关问题