我有一个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工作?我在那里放置了断点,但它甚至没有被调用。
答案 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);
}
}