2012-05-25 23 views
5

Ich habe ein enjoying Problem ... Vielleicht kann jemand (bitte!) Helfen. ich ein Modell bin mit, die Typen hat und Auszählung von und eine Eigenschaft, die UI-Modelle für jeden ausgewählten Typ von Aufzählungs halten sollte: Lassen Sie uns definieren sie mögen:ContentControl mit DataTemplateSelector - Hilfe benötigt

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

Ich möchte eine Inhaltskontrolle haben, die Datatemplateselector verwenden, um ändere seine Ansicht jedes Mal, wenn ich den selectedType ändere.

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

das Problem: In Datatemplates, die ich schaffen durch ruleEditTemplateSelector die Datacontext zurückgegeben werden soll Typ (zustimmen, dass), aber ich brauche den Zugang zum editedModel meine Datatemplate zu schaffen ... ich tun nicht wissen, wie man damit umgeht

Vielen Dank im Voraus!

Antwort

10

Die Lösung nicht sehr schwer .... war

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

Auf diese Weise der Kontext der Vorlage ist das gleiche mit dem Inhalt seiner Eltern und ich kann seine Mitglieder acces. Ich denke, ich versuche das zu tun, aber ich habe nicht korrekt ... Danke Cstein für die Beteiligung!

+0

danke! Ich habe lange nach dieser Lösung gesucht. – theateist

2

Wenn ich Sie richtig verstehe, möchten Sie Ihre DataTemplate im TemplateSelector erstellen, während die Datamaplate auf der editedModel -Eigenschaft basiert.

würde ich dieses Problem auf diese Weise lösen:

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> 

Content und listbox gleich bleiben.

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

Diese Rückkehr eines vorhandenen Datatemplate auf den Typ des Elements abhängig. Ich hoffe, ich habe dich richtig verstanden und es hilft dir.

+0

Nein ... das ist nicht mein Problem. Ich kenne den Workflow. Das Problem liegt in den Vorlagen A, B, C. weil editedModel.PropertyName nicht gefunden wurde. (Der Datenkontext ist selectedType ...) – Victor

+0

Wenn der Datacontext von Window.xaml Ihr Ansichtsmodell ist und Sie Ihre Datamplates in das Window.Resources-Tag einfügen, können Sie auf Ihren editedModel.PropertyName von Ihrem DataTemplate zugreifen. – csteinmueller

+0

Ja, ich habe das DataTemplate in Windows. Resources and no ... Leider hat es gesagt, es findet keine: editedModel.PropertyName in sectedType .... witch is true ... – Victor