Silverlight 将数据模板选择器绑定到内容控制模板

Silverlight 将数据模板选择器绑定到内容控制模板,silverlight,telerik,controltemplate,datatemplateselector,contenttemplateselector,Silverlight,Telerik,Controltemplate,Datatemplateselector,Contenttemplateselector,我希望将内容控件绑定到数据模板选择器,将变量绑定到该内容控件,然后根据变量包含的内容显示不同的模板 我已经设法让TelerikDataTemplateSelector执行我需要的操作,但是我找不到将DataTemplateSelector绑定到的控件 我发现的所有允许我使用DataTemplateSelector的控件都要求ItemsSource作为集合,如果我传入单个对象,它会引发异常 我要传递的项目是单个项目,而不是集合。内容控件似乎是我所需要的,但我无法将DataTemplateSelec

我希望将内容控件绑定到数据模板选择器,将变量绑定到该内容控件,然后根据变量包含的内容显示不同的模板

我已经设法让Telerik
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>