2010-04-06 4 views
0

Je suis nouveau dans le modèle de conception MVVM, et je travaille sur un projet d'automatisation des processus d'expédition.Avoir du bon temps pour obtenir des valeurs de propriété d'objet dans des zones de texte

Le problème particulier que j'ai est que j'ai un UserControl (mon EditShipmentView) qui, quand il charge, assigne son ViewModel à son DataContext. ViewModel reçoit un ID d'enregistrement qu'il utilise pour extraire l'entité qui représente un envoi. Il le fait avec succès, comme je peux le voir dans Mole (visualizer). Ci-dessous un fragment XAML montrant le premier couple de TextBoxes, et ce à quoi je pensais que les liaisons devraient ressembler.

<local:SnazzyForm Background="#FF318AE1"> 

    <Grid Margin="6,0,0,0"> 

     <TabControl Style="{DynamicResource SnazzyTabControl}" TabStripPlacement="Left" Background="{x:Null}" BorderBrush="{x:Null}" Margin="0,0,0,50"> 
      <TabItem Header="Overview" Style="{DynamicResource TransparentTabItems}"> 
       <Grid Margin="6,0,0,0"> 
        <Grid.ColumnDefinitions> 
         <ColumnDefinition Width="*"/> 
         <ColumnDefinition Width="*"/> 
        </Grid.ColumnDefinitions> 

        <StackPanel DataContext="{Binding Path=ShipmentRecord}"> 
         <TextBlock HorizontalAlignment="Left" Text="Contact Info" TextWrapping="Wrap" Style="{DynamicResource TitleText}"/> 
         <Path Fill="#FFFFB900" Stretch="Fill" HorizontalAlignment="Left" Width="200" Height="2" Data="M0,16.5 L278.5,16.5" Stroke="#FFFFB900"/> 
         <StackPanel Margin="0,10,0,0"> 
          <Grid Margin="0,16,0,0"> 
           <Grid.ColumnDefinitions> 
            <ColumnDefinition Width=".40*"/> 
            <ColumnDefinition Width=".60*"/> 
           </Grid.ColumnDefinitions> 
           <TextBlock HorizontalAlignment="Right" Text="Company" TextWrapping="Wrap" VerticalAlignment="Top" Style="{DynamicResource FieldLabel}" TextAlignment="Right" Margin="0,2,9,0"/> 
           <TextBox Text="{Binding Path=CompanyName, Mode=TwoWay, UpdateSourceTrigger=LostFocus, NotifyOnValidationError=True, ValidatesOnDataErrors=True, ValidatesOnExceptions=True}" TextWrapping="Wrap" d:LayoutOverrides="Height" Grid.Column="1"/> 
          </Grid> 
          <Grid Margin="0,16,0,0"> 
           <Grid.ColumnDefinitions> 
            <ColumnDefinition Width=".40*"/> 
            <ColumnDefinition Width=".60*"/> 
           </Grid.ColumnDefinitions> 
           <TextBlock HorizontalAlignment="Right" Text="Contact" TextWrapping="Wrap" VerticalAlignment="Top" Style="{DynamicResource FieldLabel}" TextAlignment="Right" Margin="0,2,9,0"/> 
           <TextBox Grid.Column="1" Text="{Binding Path=ContactName}" TextWrapping="Wrap" d:LayoutOverrides="Height"/> 
          </Grid> 

Donc, pour récapituler ... EditShipmentView (Hérite de SnazzyForm) DataContext est EditShipmentViewModel EditShipmentViewModel.ShipmentRecord est peuplée (avec succès) avec un objet envoi de ShipmentRecord.CompanyName est une chaîne qui devrait évidemment renvoyer la nom d'une entreprise. Gardez à l'esprit ceci est seulement ma tentative la plus récente. Auparavant, je n'avais pas lié le Stackpanels DataContext et j'avais les Textboxes liées en tant que telles "{Binding Path = ShipmentRecord.CompanyName}", et ce qui semble être une centaine de variations différentes. Les poils qui me restent sont rapidement en train de reculer. S'il te plaît, pense à mes cheveux, envoie de l'aide.

Cory

+0

Cela devrait fonctionner - avez-vous des erreurs de liaison de données dans la fenêtre Sortie? –

+0

Je ne reçois aucune erreur de liaison de données dans la sortie. Au départ, c'était le cas, mais c'était parce que le chargement du disque était en train d'échouer silencieusement. Une fois corrigé, toujours pas de texte, et pas d'erreur pour me dire pourquoi. – CodeWarrior

+0

Cory: Voir ma (nouvelle) réponse - c'est la chose principale que je peux penser, dans ce cas. –

Répondre

2

Montrez-nous votre code? Les chances sont que votre modèle de vue ne notifie pas la vue quand elle change. Si vos liaisons sont incorrectes (non résolues), vous verrez une sortie à cet effet dans la fenêtre de sortie de débogage de Visual Studio. Vérifiez cela aussi.

+0

OnPropertyChanged ("ShipmentRecord") A commenté il ya quelque temps dans les premières étapes de la création de ViewModel, et maintenant le coupable d'un problème qui m'a eu ... assez en colère. Merci pour votre aide! Cory – CodeWarrior

0

Assurez-vous que EditShipmentViewModel (coupable probable) et ShipmentRecord implémentez INotifyPropertyChanged.

Si les données sont chargées après la vue initiale est la configuration et la classe EditShipmentViewModel ne soulève pas un événement PropertyChanged pour ShipmentRecord, la vue (XAML) ne saura jamais mettre à jour la liaison, et vous verrez une chaîne vide.

Questions connexes