2012-05-25 13 views
5

Ho un problema di bellezza ... Forse qualcuno può (per favore!) Aiuto. Sto usando un modello che ha e l'enumerazione di tipi e una proprietà che dovrebbe contenere modelli di interfaccia utente per ogni tipo selezionato dalla enumerazione: Let definiamo come loro:ContentControl con DataTemplateSelector - aiuto necessario

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

voglio avere un controllo dei contenuti che utilizzano datatemplateselector a cambia la sua vista ogni volta che cambio il 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}"/> 

il problema: In DataTemplates che creo per essere restituito dal ruleEditTemplateSelector il DataContext è Tipo (d'accordo con questo), ma ho bisogno di accedere al editedModel di creare il mio DataTemplate ... che faccio non so come affrontarlo

Grazie in anticipo!

risposta

10

La soluzione non era molto difficile ....

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

In questo modo il contesto del modello è lo stesso con il contenuto del genitore e posso acces i suoi membri. Penso di provare a farlo ma non ho corretto il codice ... Grazie a Cstein per il coinvolgimento!

+0

grazie! Stavo cercando questa soluzione da molto tempo. – theateist

2

Se ho capito bene, si desidera creare il DataTemplate all'interno di templateselector, mentre il datatemplate si basa sulla proprietà editModel.

vorrei risolvere il problema in questo modo:

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 e listbox rimanere lo stesso.

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

Ciò restituisce un DataTemplate esistente a seconda del tipo di elemento. Spero di aver capito bene e che ti aiuti.

+0

No ... questo non è un mio problema. Conosco il flusso di lavoro. il problema è all'interno di templateA, B, C. perché editedModel.PropertyName non è stato trovato. (il contesto dati è selezionatoTipo ...) – Victor

+0

Se il tuo datacontext di Window.xaml è il tuo viewmodel e metti i tuoi datatemplates nel tag Window.Resources, puoi accedere a editModel.PropertyName dal DataTemplate – csteinmueller

+0

Sì, ho il DataTemplate in Windows. Risorse e no ... purtroppo ha detto che non ne trova: editedModel.PropertyName in sectedType .... witch is true ... – Victor

Problemi correlati