2012-05-25 12 views
5

Tengo un problema de enoying ... Tal vez alguien puede (¡por favor!) Ayudar. estoy usando un modelo que tiene y enumeración de tipos y una propiedad que debe mantener modelos de interfaz de usuario para cada tipo seleccionado de enumeración: vamos a definir como ellos:ContentControl with DataTemplateSelector - se necesita ayuda

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

quiero tener un control de contenido que utilizan datatemplateselector a cambia su vista cada vez que cambio el Tipo seleccionado.

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

el problema: En DataTemplates que creo que ser devuelto por el ruleEditTemplateSelector DataContext es Tipo (de acuerdo con eso) pero necesito el acceso a la editedModel para crear mi DataTemplate ... que hago no sé cómo manejarlo

¡Gracias de antemano!

Respuesta

10

La solución no era muy duro ....

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

De esta manera el contexto de la plantilla es el mismo con el contenido de su padre y puedo acces sus miembros. Creo que intento hacer eso, pero no codifiqué correctamente ... ¡Gracias Cstein por involucrarme!

+0

gracias! Estaba buscando esta solución por mucho tiempo. – theateist

2

Si lo entiendo bien, desea crear su DataTemplate dentro del selector de plantillas, mientras que el datatemplate se basa en la propiedad editedModel.

que resolvería este problema de esta manera:

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 y cuadro de lista permanecer igual.

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

Esto devuelve un DataTemplate existente en función del tipo de elemento. Espero haber entendido bien y te ayuda.

+0

No ... este no es mi problema. Conozco el flujo de trabajo. el problema está dentro de la plantilla A, B, C. porque editedModel.PropertyName no se encuentra. (el contexto de datos es selectedType ...) – Victor

+0

Si el contexto de datos de Window.xaml es su modelo de vista y pone sus plantillas de datos en la etiqueta Window.Resources, entonces puede acceder a su editedModel.PropertyName desde su DataTemplate – csteinmueller

+0

Sí, tengo DataTemplate en Windows. Recursos y no ... desafortunadamente dijo que no encuentra ninguno: editedModel.PropertyName en sectedType .... witch es verdadero ... – Victor

Cuestiones relacionadas