2011-06-03 3 views
1

Je vais avoir une application utilisant MVC. Il a une grille de toile et de propriété. Lorsqu'un élément est sélectionné dans le canevas. La grille des propriétés doit afficher ses détails. J'ai donc créé un écouteur d'événement et lorsque l'élément est sélectionné dans le canevas, il déclenche un événement vers le contrôleur qui transmet l'élément sélectionné à la grille de propriétés pour afficher les détails.Problème de conception MVC

Modèle:

objet d'objet nom contenant, description

Controller:

protected Controller(object model, FrameworkElement view) 
{ 
    this._model = model; 
    this._view = view; 
} 

public virtual void Initialize() 
{ 
    View.DataContext = Model; 
} 

Vue:

<TextBlock>Status</TextBlock> 
<ComboBox ItemsSource="?????"/> 

Où vue est la grille de la propriété et le modèle est l'élément sélectionné . Le problème est dans la grille des propriétés il y a une liste déroulante contenant des valeurs de recherche comment puis-je obtenir les valeurs déroulantes étant donné que le datacontext de la grille des propriétés a déjà été défini sur l'élément sélectionné qui ne contient pas de référence à ces éléments de recherche.

Je sais qu'il est facile d'utiliser du code personnalisé pour cela. Mais je ne veux pas violer l'approche MVC.

+0

Beaucoup plus d'informations sont nécessaires pour donner une réponse sensée (c'est pourquoi je n'ai pas répondu jusqu'à maintenant :)) - Je crée une interface de données, par exemple, IListProvider qui pourrait avoir une méthode appelée " ProvideList "acceptant un TStringBuilder comme paramètre - Crée une classe d'implémentation singleton pour l'interface - Crée une propriété d'interface pour le contexte et utilise celle pour sélectionner le" bon "fournisseur. Encore, je pense que vous devez décrire votre code :) –

+0

@Andrea: Cela ne fait que 7 minutes ... –

+0

LOL! Je n'ai pas remarqué que: P –

Répondre

2

se lier à une source plutôt que DataContext, les sources sont fournies par ElementName, RelativeSource & Source, de sorte que vous pouvez nommer la vue par exemple et utiliser ElementName pour l'obtenir en tant que source alors Path pourrait être DataContext.LookupValues ou quel que soit votre propriété dans le model (- le DataContext de la View est votre modèle -) est appelé.


par exemple.

<Window ... 
    Name="Window"> 
    <ItemsControl ItemsSource="{Binding Items}"> 
     <ItemsControl.ItemTemplate> 
      <DataTemplate> 
       <StackPanel> 
        <TextBlock Text="{Binding Name}" /> 
        <ComboBox ItemsSource="{Binding ElementName=Window, Path=DataContext.Occupations}" 
          SelectedItem="{Binding Occupation}" /> 
       </StackPanel> 
      </DataTemplate> 
     </ItemsControl.ItemTemplate> 
    </ItemsControl> 

    <!-- ... ---> 

Edit: Votre problème semble être que vous ne passez pas les informations dont vous avez besoin, envisager une conception qui accorde encore vous donne accès à plus que la SelectedItem une liste, par exemple

<Window ... 
     Name="Window"> 
    <ListBox Name="listBox" ItemsSource="{Binding Data}" /> 
    <ContentControl DataContext="{Binding ElementName=listBox, Path=SelectedItem}"> 
     <ComboBox ItemsSource="{Binding ElementName=Window, Path=DataContext.Occupations}" 
       SelectedItem="{Binding Occupation}" /> 
    </ContentControl> 

    <!-- ... ---> 

Le DataContext du ContentControl peut être le SelectedItem du ListBox mais le ComboBox intérieur peut encore faire référence à la DataContext de la fenêtre qui devrait fournir les informations nécessaires.

Ceci est similaire à mon premier exemple en ce que DataContext dans le DataTemplate est toujours un élément de la collection, mais vous pouvez accéder aux DataContexts externes en utilisant des sources dans vos liaisons.

+0

Merci exactement Ce dont j'ai besoin. –

+0

Pouvez-vous donner un exemple, s'il vous plaît? –

+0

Ajout d'un exemple, notez le 'Window.Name' et la liaison' ItemsSource' de la 'ComboBox'. –