2009-07-04 9 views
0

En utilisant Prism, j'ai implémenté un View, Model et Presenter de la même manière que le projet StockTraderRI. Mon problème est que j'essaye de cataloguer un panneau de pile à un objet ObservableCollection mais aucune chaîne n'est affichée.Liaison de données d'un StackPanel en utilisant Prism

Voici mon code:

Code PresentationModel:

public InfoBarPresentationModel(IInfoBarView view, IEventAggregator eventAggregator) 
    { 
     this.View = view; 
     this.View.Model = this; 
     InfoBarItems = new ObservableCollection<string>(); 
     InfoBarItems.Add("Test 1"); 
     InfoBarItems.Add("Test 2"); 
    } 

    public IInfoBarView View { get; set; } 

    public ObservableCollection<string> InfoBarItems { get; set; } 

code XAML:

<ItemsControl x:Name="list" ItemsSource="{Binding InfoBarItems}"> 
    <ItemsControl.ItemsPanel> 
     <ItemsPanelTemplate> 
      <StackPanel /> 
     </ItemsPanelTemplate> 
    </ItemsControl.ItemsPanel> 
    <ItemsControl.ItemTemplate> 
     <DataTemplate> 
      <StackPanel Orientation="Horizontal"> 
       <TextBox Text="{Binding}"/> 
      </StackPanel> 
     </DataTemplate> 
    </ItemsControl.ItemTemplate> 
</ItemsControl> 

J'ai essayé de nombreuses combinaisons de liaisons mais doivent encore comprendre pourquoi mes chaînes ne montrent en haut Qu'est-ce que je fais mal?

Rick

Répondre

0

Il s'avère que si je crée ma collection avant d'assigner le Modèle, cela fonctionne.

Code d'origine:

public InfoBarPresentationModel(IInfoBarView view, IEventAggregator eventAggregator) 
    { 
     this.View = view; 
     this.View.Model = this; 
     InfoBarItems = new ObservableCollection<string>(); 
     InfoBarItems.Add("Test 1"); 
     InfoBarItems.Add("Test 2"); 
    } 

Nouveau code:

public InfoBarPresentationModel(IInfoBarView view, IEventAggregator eventAggregator) 
    { 
     InfoBarItems = new ObservableCollection<string>(); 
     InfoBarItems.Add("Test 1"); 
     InfoBarItems.Add("Test 2"); 
     this.View = view; 
     this.View.Model = this; 
    } 

Tant votre XAML et mon amende initiale de travail XAML.

Merci.

Rick

0

Le XAML devrait fonctionner:

<ItemsControl x:Name="list" ItemsSource="{Binding Path=InfoBarItems}"> 
    <ItemsControl.ItemsPanel> 
     <ItemsPanelTemplate> 
      <StackPanel /> 
     </ItemsPanelTemplate> 
    </ItemsControl.ItemsPanel> 
    <ItemsControl.ItemTemplate> 
     <DataTemplate> 
      <TextBox Text="{Binding Path=.}" /> 
     </DataTemplate> 
    </ItemsControl.ItemTemplate> 
</ItemsControl> 

Les différences par rapport à votre approche sont:
- pas StackPanel dans la définition DataTemplate
- Ajout chemin liaison au textbox

0

vous est classe PresentationModel mise en œuvre INotifyProperytChanged? Ou est-ce votre collection DependencyProperty? Si ce n'est pas le cas, la vue ne sera jamais notifiée du fait que vous avez créé une collection. C'est pourquoi, si vous définissez la collection avant qu'elle ne soit liée à la vue, elle fonctionnera et non l'inverse. Je crois que c'est une mauvaise pratique de ne pas faire votre PresentationModel INotifyPropertyChanged sauf si toutes les propriétés sont fixées au moment de la liaison.