Question

I got an enoying problem... Maybe someone can (please!) help. I am using a model that has and enumeration of types and a property that should hold UI models for each selected type from enumeration: Let's define them like:

class ViewModel
   {
     Types selectedType{get;set;}
     UiModelBase editedModel{get;set;}
   }

I want to have a content control that use datatemplateselector to change his view each time I change the selectedType.

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

the PROBLEM: In DataTemplates that I create to be returned by ruleEditTemplateSelector the DataContext is Type (agree with that) but I need access to the editedModel to create my DataTemplate...I do not know how to deal with it

Thanks in advance!

Was it helpful?

Solution

The solution was not very hard....

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

In this way the context of template is the same with the content of his parent and I can acces his members. I think I tryind to do that but I didn't code correct... Thanks Cstein for involving !

OTHER TIPS

If I understand you right you want to create your DataTemplate inside the templateselector, while the datatemplate is based on the editedModel property.

I would solve this problem this way:

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 and listbox stay the same.

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

This return an existing datatemplate depending on the item's type. I hope I understood you right and it helps you.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top