首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从带有DataTemplateSelector的ResourceDictionary获取DataTemplate

从带有DataTemplateSelector的ResourceDictionary获取DataTemplate
EN

Stack Overflow用户
提问于 2018-01-23 17:09:43
回答 2查看 1K关注 0票数 0

目前我正在使用DataTemplateSelector在我的UserControl.Resources中查找DataTemplates,但我想将它们移到ResourceDictionary中。如何从DataTemplateSelector中查看ResourceDictionary?

这是我目前的DataTemplateSelector:

代码语言:javascript
复制
    public class SettingsDataTemplateSelector : DataTemplateSelector
{
    public override DataTemplate SelectTemplate(object item, DependencyObject container)
    {
        FrameworkElement element = container as FrameworkElement;

        if (element != null && item != null && item is Setting)
        {
            Setting registeritem = item as Setting;

            if (registeritem.EditValueVar.EditType == EditType.Textfield)
                return element.FindResource("TextboxDataTemplate") as DataTemplate;
            else if (registeritem.EditValueVar.EditType == EditType.DropDown)
                return element.FindResource("ComboDataTemplate") as DataTemplate;
            else if (registeritem.EditValueVar.EditType == EditType.Slider)
                return element.FindResource("SliderDataTemplate") as DataTemplate;
            else
                throw new ArgumentOutOfRangeException(registeritem.EditValueVar.EditType.ToString());
        }

        return null;
    }
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-01-23 17:41:07

在单独的ResourceDictionary中定义DataTemplate,然后将其添加到App.xaml

代码语言:javascript
复制
<ResourceDictionary.MergedDictionaries>        
    <ResourceDictionary Source="Resources/MyDataTemplate.xaml" />
</ResourceDictionary.MergedDictionaries>

在您的DataTemplateSelector中,您可以通过以下方式获取模板:

代码语言:javascript
复制
Application.Current.FindResource("myCustomDataTemplate") as DataTemplate;

其中,myCustomDataTemplate是您在MyDataTemplate.xaml文件中指定的数据模板的键。

票数 2
EN

Stack Overflow用户

发布于 2018-01-23 18:35:03

您可以向DataTemplateSelector类添加ResourceDictionary属性:

代码语言:javascript
复制
public class SettingsDataTemplateSelector : DataTemplateSelector
{
    public ResourceDictionary ResourceDictionary { get; set; }

    public override DataTemplate SelectTemplate(object item, DependencyObject container)
    {
        FrameworkElement element = container as FrameworkElement;
        if (element != null && item != null && item is Setting)
        {
            Setting registeritem = item as Setting;

            if (registeritem.EditValueVar.EditType == EditType.Textfield)
                return ResourceDictionary["TextboxDataTemplate"] as DataTemplate;
            else if (registeritem.EditValueVar.EditType == EditType.DropDown)
                return ResourceDictionary["ComboDataTemplate"] as DataTemplate;
            else if (registeritem.EditValueVar.EditType == EditType.Slider)
                return ResourceDictionary["SliderDataTemplate"] as DataTemplate;
            else
                throw new ArgumentOutOfRangeException(registeritem.EditValueVar.EditType.ToString());
        }

        return null;
    }
}

您在XAML中设置的...that:

代码语言:javascript
复制
<local:SettingsDataTemplateSelector x:Key="selector">
    <local:SettingsDataTemplateSelector.ResourceDictionary>
        <ResourceDictionary Source="Dictionary1.xaml" />
    </local:SettingsDataTemplateSelector.ResourceDictionary>
</local:SettingsDataTemplateSelector>
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48397889

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档