2010-11-28 5 views
0

J'ai actuellement une classe contenant les propriétés suivantesQue ce soit pour inclure vue des informations spécifiques dans le modèle

public class Chromosome 
{ 
    public int Length 
    { 
     get; 
     set; 
    } 

    public int Number 
    { 
     get; 
     set; 
    } 

    public Chromosome(int _length, int _number) 
    { 
     Length = _length; 
     Number = _number; 
    } 
} 

J'ai données de la zone de liste binded à mon modèle de vue. La source des éléments est constituée de données liées à Observable des objets chromosome ChromosomeList.

<Grid> 
     <ListBox Style="{StaticResource ListBoxStyle}" 
       ItemsSource="{Binding Path=ChromosomeList}" 
       ItemTemplate="{StaticResource ChromosomeDataTemplate}"> 
     </ListBox> 
    </Grid> 

ItemTemplate pour la liste des éléments de la boîte est ChromosomeDataTemplate et est illustré ci-dessous.

<DataTemplate x:Key="ChromosomeDataTemplate"> 
    <Border> 
     <Grid Height="10"> 
      <TextBlock VerticalAlignment="Bottom" 
         Text="{Binding Number}"> 
      </TextBlock> 
     </Grid> 
    </Border> 

Dans ce cas, je veux la Taille propriété de la grille à données binded au Longueur propriété du chromosome. Cependant, comme le Longueur est extrêmement grand, j'ai besoin qu'il soit un petit pourcentage de la valeur réelle. Je pouvais le faire par:

  • Faire une nouvelle propriété spécifique pour la hauteur modifiée

Cependant, je sens que cela ne suit pas le modèle MVVM. Est-il possible de modifier la valeur Longueur lors de la liaison de données?

Répondre

3

Chromosome est votre modèle. Votre code XAML réside dans votre vue. La valeur "modified-length" hypothétique devrait résider dans votre ViewModel.

Vous avez raison de dire que faire une nouvelle propriété pour la hauteur modifiée n'est pas MVVM (et c'est une très mauvaise idée en général, bien sûr).

Pour une meilleure approche, vous devez normalement placer la propriété modified-length dans le ViewModel. Cependant, votre problème est maintenant que votre ViewModel a un ObservableCollection<Chromosome> et ne peut donc pas fournir une simple propriété de longueur modifiée pour chacune des instances Chromosome.

Par conséquent, vous avez deux choix:

  1. Mettre en place un ValueConverter qui se traduit par l'Length d'origine à un Grid.Height appopriate. Cela peut être dans votre ViewModel ou dans la vue, mais je pense que le placer dans le ViewModel n'est pas approprié (puisqu'il sera utilisé par une vue spécifique uniquement). C'est l'approche la plus simple.

  2. Enveloppez chaque Chromosome dans son propre ViewModel, par ex. ChromosomeViewModel. Votre ViewModel existant prendrait une collection de Chromosome s et exposerait un ObservableCollection<ChromosomeViewModel>. Vous devez ensuite créer un ChromosomeView lié à chaque ViewModel, ce qui correspond à ce que vous avez maintenant dans votre ChromosomeDataTemplate.Depuis le ChromosomeView sera lié à un ChromosomeViewModel, qui à son tour encapsule un seul Chromosome, vous pouvez maintenant fournir une propriété "modified-length" directement dans votre ChromosomeViewModel.

Si c'est juste pour cela, je suggère d'aller avec le ValueConverter. Cependant, gardez la deuxième approche à l'esprit pour les scénarios plus complexes.

+0

C'est juste pour ça. Je vais encapsuler les futures collections dans View Models. –

0

Pourquoi ne pas utiliser un convertisseur ici? Voir par exemple MSDN