Привязка селектора шаблонов данных к шаблону управления содержимым
Я хотел бы привязать элемент управления содержимым к селектору шаблонов данных, привязать переменную к этому элементу управления содержимым, а затем отобразить другой шаблон в зависимости от того, что содержит переменная.
Мне удалось заставить Телерик DataTemplateSelector
делать то, что мне нужно, однако я не могу найти элемент управления для привязки DataTemplateSelector
.
Все найденные элементы управления, которые позволяют мне использовать DataTemplateSelector
, требуют, чтобы ItemsSource
был коллекцией, если я передаю один объект, он выбрасывает исключение.
Предмет, который я передаю, - это отдельный предмет, а не коллекция. Управление контентом, похоже, то, что мне нужно, но я не могу привязать к нему DataTemplateSelector
.
DataTemplateSelector
, что я могу связать с Content Control.
Любая помощь будет весьма признательна.1 ответ:
Я думаю, вам следует избегать занятий Телерика (которые, на мой взгляд, немного усложняют ситуацию в данном случае).
Как насчет стандартной реализации
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>