首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >ContentControl with DataTemplateSelector -需要帮助

ContentControl with DataTemplateSelector -需要帮助
EN

Stack Overflow用户
提问于 2012-05-25 08:57:45
回答 2查看 14.6K关注 0票数 6

我有个问题.也许有人可以(拜托!)帮助。我使用的是一个具有和枚举类型的模型,以及一个属性,它应该包含每个从枚举中选择的类型的UI模型:让我们对它们进行如下定义:

代码语言:javascript
复制
class ViewModel
   {
     Types selectedType{get;set;}
     UiModelBase editedModel{get;set;}
   }

我希望有一个内容控件,它可以在每次更改selectedType时使用datatemplateselector来更改其视图。

代码语言:javascript
复制
    <ListBox x:Name="RuleTypeList" ItemsSource="{Binding Source={StaticResource Types}}" SelectedItem="{Binding Path=selectedType}"/>     
    <!--Content control-->
    <ContentControl ContentTemplateSelector="{StaticResource ruleEditTemplateSelector}" 
             Content="{Binding SelectedItem, ElementName=RuleTypeList}"/>

问题:在我创建的由ruleEditTemplateSelector返回的ruleEditTemplateSelector中,DataContext类型(同意),但是我需要访问editedModel来创建数据模板.我不知道如何处理它

提前感谢!

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-05-31 07:23:52

解决办法不是很难..。

代码语言:javascript
复制
 DataContext="{Binding RelativeSource={RelativeSource AncestorType=ContentControl},Path=DataContext}"

通过这种方式,模板的上下文与他的父母的内容是相同的,我可以访问他的成员。我想我想这么做,但我没有正确编码.谢谢Cstein的参与!

票数 13
EN

Stack Overflow用户

发布于 2012-05-25 09:38:07

如果我对您的理解正确,您希望在模板选择器中创建您的DataTemplate,而数据板则基于editedModel属性。

我会这样解决这个问题:

Windows.xaml:

代码语言:javascript
复制
<Window.Resources>
    <local:Selector x:Key="sel"/>

    <DataTemplate x:Key="templateA">
        <TextBlock Text="{Binding editedModel.PropertyName}"/>
    </DataTemplate>

    <DataTemplate x:Key="templateB">
        <TextBlock Text="{Binding editedModel.PropertyName}"/>
    </DataTemplate>

    <DataTemplate x:Key="templateC">
        <TextBlock Text="{Binding editedModel.PropertyName}"/>
    </DataTemplate>

</Window.Resources>

内容控制和列表框保持不变。

DataTemplateSelector:

代码语言:javascript
复制
public class Selector : DataTemplateSelector
{
    public override DataTemplate SelectTemplate(object item, DependencyObject container)
    {
        if (item is ClassA)
            return (container as FrameworkElement).FindResource("TemplateA") as DataTemplate;
        else if (item is ClassB)
            return (container as FrameworkElement).FindResource("TemplateB") as DataTemplate;
        else if (item is ClassC)
            return (container as FrameworkElement).FindResource("TemplateC") as DataTemplate;
        return null;
    }
}

这将根据项目的类型返回现有的数据板。我希望我对你的理解是对的,这对你有帮助。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10751419

复制
相关文章

相似问题

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