Frage

Prism verwenden, habe ich eine Ansicht, Modell und Presenter ähnlich wie das StockTraderRI Projekt umgesetzt. Mein Problem ist, dass ich versuche, eine Stackpanel auf ein ObservableCollection-Objekt Databind aber keine Strings angezeigt werden.

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 habe zahlreiche Kombinationen von Bindungen versucht aber noch, um herauszufinden, warum meine Saiten zeigen nie auf. Was mache ich falsch?

Rick

War es hilfreich?

Lösung 2

Es stellt sich heraus, dass, wenn ich meine Sammlung zu erstellen, bevor das Modell zuweisen, es funktioniert.

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

Sowohl XAML und mein ursprüngliche XAML funktionieren.

Danke.

Rick

Andere Tipps

Das 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

Sind Sie PresentationModel Klasse Umsetzung INotifyProperytChanged? Oder ist Ihnen Sammlung ein DependencyProperty? Wenn das nicht der Fall ist, wird die Ansicht nicht von der Tatsache benachrichtigt, dass Sie eine Sammlung erstellt.

Das ist, warum, wenn Sie die Sammlung ein, bevor es zu der Ansicht gebunden ist es funktionieren wird und nicht umgekehrt. Ich glaube, es ist eine schlechte Praxis nicht zu Ihrem PresentationModel INotifyPropertyChanged zu machen, wenn alle Eigenschaften an Bindezeit festgelegt werden.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top