Wpf 带有DataTemplateSelector的ContentControl-需要帮助

Wpf 带有DataTemplateSelector的ContentControl-需要帮助,wpf,datatemplate,contentcontrol,datatemplateselector,Wpf,Datatemplate,Contentcontrol,Datatemplateselector,我有个问题。。。也许有人可以(请!)帮忙。 我使用的是一个具有和枚举类型的模型,以及一个应该保存枚举中每个选定类型的UI模型的属性:让我们像这样定义它们: class ViewModel { Types selectedType{get;set;} UiModelBase editedModel{get;set;} } 我希望有一个内容控件,在每次更改selectedType时使用datatemplateselector来更改其视图 <ListBo

我有个问题。。。也许有人可以(请!)帮忙。 我使用的是一个具有和枚举类型的模型,以及一个应该保存枚举中每个选定类型的UI模型的属性:让我们像这样定义它们:

class ViewModel
   {
     Types selectedType{get;set;}
     UiModelBase editedModel{get;set;}
   }
我希望有一个内容控件,在每次更改selectedType时使用datatemplateselector来更改其视图

    <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返回的DataTemplates中 DataContext类型的(同意这一点),但我需要访问editedModel来创建我的DataTemplate…我不知道如何处理它


提前谢谢

如果我理解正确,您希望在templateselector中创建DataTemplate,而DataTemplate基于editedModel属性

我会这样解决这个问题:

Windows.xaml:

<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>
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;
    }
}

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

解决办法并不难

 DataContext="{Binding RelativeSource={RelativeSource AncestorType=ContentControl},Path=DataContext}"
这样,模板的上下文与他父母的内容相同,我可以访问他的成员。 我想我试着这么做,但我没有正确的编码。。。
感谢Cstein的参与

不…这不是我的问题。我知道工作流程。问题出在templateA、B、C中,因为找不到editedModel.PropertyName。(数据上下文为selectedType…)如果您的Window.xaml的datacontext是您的viewmodel,并且您将datatemplates放入Window.Resources标记中,那么您可以从DataTemplate中访问editedModel.PropertyName是的,我在Windows中有DataTemplate。参考资料和否…不幸的是,它说在sectedType中找不到任何:editedModel.PropertyName…这是真的…是真的只要不声明,就找不到具有该名称的属性。还是我误解了你?我很震惊我可能不明白你在说什么。。。editedModel.PropertyName的实例已存在于代码隐藏中…为什么要再次声明它…我想更改已存在的实例。我理解错了?谢谢!我一直在寻找这个解决方案。