0

Prism を使用して、StockTraderRI プロジェクトによく似たビュー、モデル、およびプレゼンターを実装しました。私の問題は、スタックパネルを ObservableCollection オブジェクトにデータバインドしようとしていますが、文字列が表示されていないことです。

これが私のコードです:

プレゼンテーションモデル コード:

    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 コード:

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

さまざまなバインディングの組み合わせを試しましたが、文字列が表示されない理由はまだわかりません。私は何を間違っていますか?

リック

4

3 に答える 3

0

次のXAMLが機能するはずです。

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

アプローチの違いは次のとおりです。
-DataTemplate定義にStackPanelがない-TextBox
バインディングにバインディングパスを追加

于 2009-07-05T13:13:26.877 に答える
0

モデルを割り当てる前にコレクションを作成すると、うまくいくことがわかりました。

元のコード:

  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 InfoBarPresentationModel(IInfoBarView view, IEventAggregator eventAggregator)
    {
        InfoBarItems = new ObservableCollection<string>();
        InfoBarItems.Add("Test 1");
        InfoBarItems.Add("Test 2");
        this.View = view;
        this.View.Model = this;
    }

あなたの xaml と私の元の xaml の両方が正常に動作します。

ありがとうございました。

リック

于 2009-07-06T17:55:43.313 に答える
0

あなたはPresentationModelクラスを実装していINotifyProperytChangedますか? それともコレクションDependencyPropertyですか?そうでない場合、コレクションを作成したという事実がビューに通知されることはありません。

そのため、ビューにバインドされる前にコレクションを設定すると、コレクションは機能し、その逆は機能しません。INotifyPropertyChangedすべてのプロパティがバインド時に修正されない限り、PresentationModel を作成しないのは悪い習慣だと思います。

于 2009-07-20T12:30:00.243 に答える