ItemTemplateSelector不适用于没有Binding的ListView

时间:2016-08-03 13:51:10

标签: c# listview uwp uwp-xaml

我有一个ListView,其ItemsSource我在后面的代码中以编程方式设置。我以前只有一个模板,但现在我想使用多个模板,并根据我添加到ListView的项目选择模板。

这是我的XAML代码:

<Page.Resources>
<local:TemplateSelector x:Key="myTemplateSelector" TemplateA="{StaticResource TemplateA}" TemplateB="{StaticResource TemplateB}" />

<!-- TemplateA and TemplateB -->
</Page.Resources>

 <ListView
        x:Name="MasterListView"
        Grid.Row="1"
        ItemContainerTransitions="{x:Null}" 
        ItemTemplateSelector="{StaticResource myTemplateSelector}"
        IsItemClickEnabled="True"
        ItemClick="MasterListView_ItemClick"/>

然后我设置了ListView的ItemSource,这是我的TemplateSelector:

  public class TemplateSelector : DataTemplateSelector
{
    public DataTemplate TemplateA { get; set; }
    public DataTemplate TemplateB { get; set; }

    public new DataTemplate SelectTemplate(object item, DependencyObject container)
    {

        return TemplateA;
    }
}

然而,这不起作用。而不是我想要的模板,我总是为每个项目获得相同的文本:AppName.ViewModels.ViewModel1(我想要显示的数据的类型)。

在过去,当我只有一个itemtemplate时,我在xaml中使用了它并且它有效:

        <ListView
        x:Name="MasterListView"
        Grid.Row="1"
        ItemContainerTransitions="{x:Null}" 
        ItemTemplate="{StaticResource TemplateA}"
        IsItemClickEnabled="True"
        ItemClick="MasterListView_ItemClick"/>

如何让ItemTemplateSelector工作?我在那里放置了断点,但它甚至没有被调用。

2 个答案:

答案 0 :(得分:2)

正如DataTemplateSelector.SelectTemplate(Object, DependencyObject) method备注中描述的那样:

  

应用代码通常不会调用 SelectTemplate 方法;存在这样的方法,以便基础架构可以在选择正确模板的同时调用它,方法是使用属性值中的 DataTemplateSelector 实例,例如 ItemsControl.ItemsTemplateSelector 。要在派生类中提供特定模板,请覆盖 SelectTemplateCore(Object, DependencyObject) 方法。

所以我们应该使用

protected override DataTemplate SelectTemplateCore(object item, DependencyObject container)

而不是

public new DataTemplate SelectTemplate(object item, DependencyObject container)

答案 1 :(得分:1)

 public override DataTemplate SelectTemplate(object item, DependencyObject container)

而不是

public new DataTemplate SelectTemplate(object item, DependencyObject container)

编辑,由于访问修饰符,这是4.5.2的签名(注意它是公开的):

#region Assembly PresentationFramework, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35
// C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.5.2\PresentationFramework.dll
#endregion

namespace System.Windows.Controls
{
//
// Summary:
//     Provides a way to choose a System.Windows.DataTemplate based on the data object
//     and the data-bound element.
public class DataTemplateSelector
{
    //
    // Summary:
    //     Initializes a new instance of the System.Windows.Controls.DataTemplateSelector
    //     class.
    public DataTemplateSelector();

    //
    // Summary:
    //     When overridden in a derived class, returns a System.Windows.DataTemplate based
    //     on custom logic.
    //
    // Parameters:
    //   item:
    //     The data object for which to select the template.
    //
    //   container:
    //     The data-bound object.
    //
    // Returns:
    //     Returns a System.Windows.DataTemplate or null. The default value is null.
    public virtual DataTemplate SelectTemplate(object item, DependencyObject container);
}
}