gpt4 book ai didi

silverlight - 将数据模板选择器绑定(bind)到内容控件模板

转载 作者:行者123 更新时间:2023-12-04 03:10:52 25 4
gpt4 key购买 nike

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

我已经设法让 Telerik DataTemplateSelector 完成我需要它做的事情,但是我找不到将 DataTemplateSelector 绑定(bind)到的控件。

我发现所有允许我使用 DataTemplateSelector 的控件都要求 ItemsSource 是一个集合,如果我传入一个它抛出的单个对象一个异常(exception)。

我传递的项目是单个项目而不是集合。内容控件似乎是我需要的,但我无法将 DataTemplateSelector 绑定(bind)到它。

是否有类似于 Content Control 的 telerik 控件,我可以将 DataTemplateSelector 绑定(bind)到该控件?或者是否有类似于 DataTemplateSelector 的东西,我可以绑定(bind)到 Content Control

如有任何帮助,我们将不胜感激。

最佳答案

我认为您应该考虑避免使用 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>

关于silverlight - 将数据模板选择器绑定(bind)到内容控件模板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7660462/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com