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