Silverlight 将数据模板选择器绑定到内容控制模板
我希望将内容控件绑定到数据模板选择器,将变量绑定到该内容控件,然后根据变量包含的内容显示不同的模板 我已经设法让TelerikSilverlight 将数据模板选择器绑定到内容控制模板,silverlight,telerik,controltemplate,datatemplateselector,contenttemplateselector,Silverlight,Telerik,Controltemplate,Datatemplateselector,Contenttemplateselector,我希望将内容控件绑定到数据模板选择器,将变量绑定到该内容控件,然后根据变量包含的内容显示不同的模板 我已经设法让TelerikDataTemplateSelector执行我需要的操作,但是我找不到将DataTemplateSelector绑定到的控件 我发现的所有允许我使用DataTemplateSelector的控件都要求ItemsSource作为集合,如果我传入单个对象,它会引发异常 我要传递的项目是单个项目,而不是集合。内容控件似乎是我所需要的,但我无法将DataTemplateSelec
DataTemplateSelector
执行我需要的操作,但是我找不到将DataTemplateSelector
绑定到的控件
我发现的所有允许我使用DataTemplateSelector
的控件都要求ItemsSource
作为集合,如果我传入单个对象,它会引发异常
我要传递的项目是单个项目,而不是集合。内容控件似乎是我所需要的,但我无法将DataTemplateSelector
绑定到它
是否有类似于内容控件的telerik控件,我可以将DataTemplateSelector绑定到该控件?或者有类似于DataTemplateSelector
的东西可以绑定到内容控件
我认为你应该考虑避免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)
{
// No template...
if (item == null)
return null;
// Enumeration discriminant:
if (item is BoundTemplateDiscriminantType)
switch ((BoundTemplateDiscriminantType)item)
{
case BoundTemplateDiscriminantType.Type1:
return Template1;
case BoundTemplateDiscriminantType.Type2:
return Template2;
// Not implemented...
default:
throw new NotImplementedException();
}
// Integer discriminant:
else if (item is int)
{
return (int)item > 0 ? Template1 : Template2;
}
// Other discriminants...
else
// Not yet implemented...
throw new NotImplementedException();
}
}
…最后是XAML设计(不是通常的ListBoxItem,而是本例中的可滚动内容):
... 等等
耽搁了这么久……但我给你一个答案(我刚刚发现了这个问题!)!!也许可以帮助某人…我已经停止使用Telerik和Silverlight开发应用程序,因此我无法验证这是否适用于我的情况,但我接受了答案,因为它可能会帮助其他人。
<ScrollViewer>
<ScrollViewer.ContentTemplate>
<DataTemplate>
<utilities:myTemplateSelector Content="{Binding Path=BoundDiscriminant, Mode=OneWay}">
<!--Content of first template...-->
<utils:myTemplateSelector.Template1>
<DataTemplate>
<TextBlock Text={Binding Path=BoundDescription, Mode=OneWay} />
</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>