Привязка селектора шаблона данных к шаблону управления контентом - PullRequest
3 голосов
/ 05 октября 2011

Я хотел бы привязать элемент управления содержимым к селектору шаблона данных, привязать переменную к этому элементу управления содержимым и затем отобразить другой шаблон в зависимости от того, что содержит переменная.

Мне удалось получитьTelerik DataTemplateSelector, чтобы сделать то, что мне нужно, однако я не могу найти элемент управления для привязки DataTemplateSelector к.

Все элементы управления, которые я нашел, которые позволяют мне использовать DataTemplateSelector требует, чтобы ItemsSource был коллекцией, если я передаю один объект, он выдает исключение.

Элемент, который я передаю, является отдельным элементом, а не коллекцией.Кажется, мне нужен элемент управления контентом, но я не могу привязать к нему DataTemplateSelector.

Существует ли элемент управления telerik, аналогичный Контенту содержимого , который я могу привязатьDataTemplateSelector для?Или есть что-то похожее на DataTemplateSelector, которое я могу связать с Контролем контента .

Любая помощь будет принята с благодарностью.

1 Ответ

3 голосов
/ 30 апреля 2013

Я думаю, вам следует избегать занятий 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);
    }
}

Затем вы можете написать вамcustom 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>
...