2010-10-19 5 views
2

J'essaie de suivre this little tutorial, mais je reçois toujours cette exception.StackOverflowException sur InitializeComponent

Le XAML concerné ressemble à ceci:

<StatusBar Margin="0,288,0,0" Name="statusBar" Height="23" VerticalAlignment="Bottom"> 
     <StatusBar.DataContext> 
      <m:MainWindow /> 
     </StatusBar.DataContext> 
     <TextBlock Name="statusText" Text="{Binding Path=StatusBarText, NotifyOnTargetUpdated=True}" DataContext="{Binding}"> 
      <TextBlock.Triggers> 
       <EventTrigger RoutedEvent="Binding.TargetUpdated"> 
        <BeginStoryboard> 
         <Storyboard> 
          <DoubleAnimationUsingKeyFrames Storyboard.TargetProperty="Opacity"> 
           <EasingDoubleKeyFrame KeyTime="0" Value="0"/> 
           <EasingDoubleKeyFrame KeyTime="0:0:0.25" Value="1"/> 
           <EasingDoubleKeyFrame KeyTime="0:0:4" Value="1"/> 
           <EasingDoubleKeyFrame KeyTime="0:0:5" Value="0"/> 
          </DoubleAnimationUsingKeyFrames> 
         </Storyboard> 
        </BeginStoryboard> 
       </EventTrigger> 
      </TextBlock.Triggers> 
     </TextBlock> 
    </StatusBar> 

Je devine que je reçois le StackOverflowException parce que je suis en train d'utiliser MainWindow comme DataContext. Je veux utiliser le MainWindow parce qu'il semble être un endroit logique pour mettre ma propriété StatusBarText,

public partial class MainWindow : Window 
{ 
    public string StatusBarText { get; set; } 

Il facilite l'accès à mon code-behind gestionnaires d'événements. Qu'est-ce que je suis supposé faire alors? Où suis-je censé mettre cette propriété? Ou existe-t-il un moyen de définir le DataContext sur "this" afin qu'il ne crée pas une nouvelle instance de MainWindow et se réfère simplement à lui-même?

Répondre

3

Je règle généralement mon DataContext en code-behind, dans le constructeur (j'utilise généralement MVVM, mais j'ai utilisé une fenêtre dans les petits projets temporaires):

public MainWindow() 
{ 
    statusBar.DataContext = this; 
} 

Notez que dans votre exemple de code indiqué, vous n'obtiendrez votre valeur StatusBarText initiale, parce que vous n'êtes pas implémentez INotifyPropertyChanged.

+0

Parfait! Bon appel sur le 'NotifyPropertyChanged' aussi .. J'ai découvert que je pourrais mettre le' DataContext' 'this' dans le code derrière une seconde avant que vous l'ayez posté, mais alors j'ai rencontré le problème que vous avez mentionné. Assez facile à notifier si ~! – mpen

1

Idéalement, les propriétés auxquelles vous allez vous lier devraient se trouver dans un ViewModel suivant le modèle MVVM, en s'éloignant de la vue. Puisque ce n'est pas votre question, cependant, nous irons de l'avant ... le DataContext est hérité de son parent. Par conséquent, si le StatusBar vit dans la fenêtre, ce dont je suis certain qu'il le fait, il héritera déjà du DataContext de la fenêtre. Essentiellement, vous essayez de lier un composant d'interface utilisateur à l'aide d'un composant d'interface utilisateur (Window) en tant que source pour le DataContext. Loin d'être idéal ... voici une vue d'ensemble du MVVM pattern ...

+1

Il héritera du DataContext de la fenêtre uniquement s'il est défini pour la fenêtre, et n'est pas réinitialisé en utilisant la propriété DataContext sur le UIElement lui-même (ce qui est le cas). –

+0

Je suppose que je peux jeter le StatusBarText dans son propre ViewModel .. semblait juste exagéré pour quelque chose de si simple, et pour un seul élément. – mpen

+0

@Wonko Correct, d'où venait son StackOverFlowException ... c'est ce qu'il aurait besoin de supprimer pour adopter une approche différente. –

Questions connexes