C# 根据数据WP 8.1的不同列表框项目样式

C# 根据数据WP 8.1的不同列表框项目样式,c#,listbox,windows-phone-8.1,datatemplateselector,C#,Listbox,Windows Phone 8.1,Datatemplateselector,我有一个由项目填充的列表框。每个项目包含一个对象,如下所示: 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

我有一个由项目填充的列表框。每个项目包含一个对象,如下所示:

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,但无法真正理解它是如何工作的。。。。有人能教我怎么做吗

首先,创建一个
数据模板选择器,如下所示:

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"];
        }
    }
}
listbox.ItemTemplateSelector = new MyTemplateSelector();
在此代码中,数据模板应位于App.xaml中。基本上,该方法必须返回您想要作为DataTemplate对象的DataTemplate。你将如何得到那个物体完全取决于你

第二步,您需要如下设置
列表框的
ItemTemplateSelector

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"];
        }
    }
}
listbox.ItemTemplateSelector = new MyTemplateSelector();
就这样。现在,根据IsOuter属性,不同的项目将具有不同的模板

一些想法

您可能需要更多可重用的模板选择器。例如,您可能有一个带有一个
DataTemplate
属性的接口,在
SelectTemplateCore
中,检查该项是否实现了该接口,如果是,则返回该属性的值


无论如何,上面的代码现在应该可以使用,如果您将来需要更多的
DataTemplateSelector
s,您将找到编写/使用它们的最方便的方法。:)

谢谢你的回答和建议!!根据上面的代码,作为资源,我需要在我的页面资源中有两个名为DataTemplate1和DataTemplate2的DataTemplate,对吗?我稍微修改了我的答案。您应该将这两个模板放在App.xaml中,或者调整代码以从当前页面的资源中获取属性,或者将这两个模板的属性添加到MyTemplateSelector类中,并在创建其实例时进行设置。但是App.xaml是最简单的非常感谢你!伟大的答案!它运行良好:)