ContentControl with DataTemplateSelector - 需要帮助

时间:2012-05-25 08:57:46

标签: wpf datatemplate contentcontrol datatemplateselector

我有一个令人讨厌的问题......也许有人可以(请!)帮忙。 我使用的模型具有类型和枚举的属性,应该为枚举中的每个选定类型保存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}"/>

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

提前致谢!

2 个答案:

答案 0 :(得分:12)

解决方案不是很难......

 DataContext="{Binding RelativeSource={RelativeSource AncestorType=ContentControl},Path=DataContext}"

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

答案 1 :(得分:2)

如果我理解你,你想在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>

Contentcontrol和listbox保持不变。

<强> DataTemplateSelector:

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。我希望我理解你,这对你很有帮助。