我认为你应该考虑避免使用Telerik的类(在我看来,这种情况会使事情变得更加复杂)。
那么标准的DataTemplateSelector
实现怎么样呢?你自己实现非常容易!
首先,你需要声明一个“经典”的抽象类DataTemplateSelector
的实现:
public abstract class DataTemplateSelector : ContentControl
{
public virtual DataTemplate SelectTemplate(object item, DependencyObject container)
{
return null;
}
protected override void OnContentChanged(object oldContent, object newContent)
{
base.OnContentChanged(oldContent, newContent);
ContentTemplate = SelectTemplate(newContent, this);
}
}
然后,您可以编写自定义的 DataTemplateSelector
...
public class myTemplateSelector : DataTemplateSelector
{
public DataTemplate Template1 { get; set; }
public DataTemplate Template2 { get; set; }
public override DataTemplate SelectTemplate(object item, DependencyObject container)
{
if (item == null)
return null;
if (item is BoundTemplateDiscriminantType)
switch ((BoundTemplateDiscriminantType)item)
{
case BoundTemplateDiscriminantType.Type1:
return Template1;
case BoundTemplateDiscriminantType.Type2:
return Template2;
default:
throw new NotImplementedException();
}
else if (item is int)
{
return (int)item > 0 ? Template1 : Template2;
}
else
throw new NotImplementedException();
}
}
...最后是XAML设计(不是通常的ListBoxItem,而是可滚动的内容):
<ScrollViewer>
<ScrollViewer.ContentTemplate>
<DataTemplate>
<utilities:myTemplateSelector Content="">
<!--Content of first template...-->
<utils:myTemplateSelector.Template1>
<DataTemplate>
<TextBlock Text= />
</DataTemplate>
</utils:myTemplateSelector.Template1>
<!--Content of second template...-->
<utils:myTemplateSelector.Template2>
<DataTemplate>
</DataTemplate>
</utils:myTemplateSelector.Template2>
... and so on...
</utilities:myTemplateSelector>
</DataTemplate>
</ScrollViewer.ContentTemplate>
</ScrollViewer>