2009-07-04 11 views
0

Mit Prism habe ich View, Model und Presenter ähnlich wie das StockTraderRI-Projekt implementiert. Mein Problem ist, dass ich versuche, ein Stackpanel an ein ObservableCollection-Objekt zu binden, aber keine Strings angezeigt werden.Datenbindung eines StackPanels mit Prism

Hier ist mein Code:

PresentationModel Code:

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; } 

XAML-Code:

<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> 

ich zahlreiche Kombinationen von Bindungen versucht haben, haben aber noch, um herauszufinden, warum nie meine Saiten zeigen oben. Was mache ich falsch?

Rick

Antwort

0

Es stellt sich heraus, dass es funktioniert, wenn ich meine Sammlung vor dem Zuweisen des Modells erstelle.

Originalcode:

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"); 
    } 

Neuer 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; 
    } 

Beide XAML und meiner ursprünglichen XAML funktionieren.

Vielen Dank.

Rick

0

Die folgende XAML sollte funktionieren:

<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> 

Die Unterschiede zu Ihrem Ansatz sind:
- kein Stackpanel in der Datatemplate-Definition
- zu dem TextBox Bindungspfad Bindung

0

Sind Sie PresentationModel Klasse Umsetzung INotifyProperytChanged? Oder ist deine Sammlung ein DependencyProperty? Wenn dies nicht der Fall ist, wird die Ansicht nie darüber informiert, dass Sie eine Sammlung erstellt haben.

Deshalb, wenn Sie die Sammlung festlegen, bevor es an die Ansicht gebunden ist, wird es funktionieren und nicht umgekehrt. Ich glaube, es ist eine schlechte Praxis, Ihr PresentationModel INotifyPropertyChanged nicht zu erstellen, es sei denn, alle Eigenschaften werden zur Bindungszeit festgelegt.