使用Prism对StackPanel进行数据绑定

时间:2009-07-04 21:12:19

标签: silverlight-2.0 prism stackpanel

使用Prism,我实现了一个View,Model和Presenter,就像StockTraderRI项目一样。我的问题是我正在尝试将stackpanel数据绑定到ObservableCollection对象,但没有显示任何字符串。

这是我的代码:

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

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>

我尝试了很多绑定组合,但还没弄清楚为什么我的字符串永远不会出现。我做错了什么?

瑞克

3 个答案:

答案 0 :(得分: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绑定的绑定路径

答案 1 :(得分: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工作正常。

谢谢。

瑞克

答案 2 :(得分:0)

您是PresentationModel类实现INotifyProperytChanged吗?或者你是DependencyProperty的集合?如果不是这种情况,那么视图将永远不会被通知您创建了一个集合。

这就是为什么如果你设置集合之前它将绑定到视图它将工作,而不是相反。我确实认为,除非在绑定时修复所有属性,否则不要制作PresentationModel INotifyPropertyChanged