将数据模板选择器绑定到内容控件模板。

3
我想将内容控件绑定到数据模板选择器,将变量绑定到该内容控件,然后根据变量的值显示不同的模板。
我已经通过Telerik的DataTemplateSelector找到了可以满足需求的方法,但我找不到可以将DataTemplateSelector绑定到的控件。
我找到的所有控件都需要ItemsSource是集合,如果我传递单个对象就会抛出异常。
我传递的项目只是一个单独的项目而不是集合。虽然内容控件似乎符合我的需求,但我无法将DataTemplateSelector绑定到它上面。
是否有类似于Content Control的Telerik控件,我可以将DataTemplateSelector绑定到这个控件上?或者是否有类似于DataTemplateSelector的东西,可以绑定到Content Control上?
非常感谢您的帮助。

由于有这么长时间的延迟...但我会给你一个答案(我刚刚发现了这个问题!)!! 也许可以帮助到某些人... - MAXE
1个回答

3

我认为你应该考虑避免使用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,而是可滚动的内容):

<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>

2
我已经停止使用Telerik和Silverlight开发这个应用程序,所以无法验证在我的情况下是否有效,但我已经接受了这个答案,因为它可能对其他人有帮助。 - Midimatt

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接