ListBox ItemsSource绑定不起作用

时间:2010-08-25 14:35:24

标签: c# binding silverlight-3.0 windows-phone-7

我正在开发一个Windows Phome应用程序。我在页面上有以下ListBox:

<ListBox Margin="10,10,8,8" x:Name="WallList">
  <ListBox.ItemsPanel>
    <ItemsPanelTemplate>
      <StackPanel />
    </ItemsPanelTemplate>
  </ListBox.ItemsPanel>
  <ListBox.ItemTemplate>
    <DataTemplate>
      <Grid x:Name="ListBoxItemLayout" Background="Transparent" Margin="10">
        <Grid.ColumnDefinitions>
          <ColumnDefinition Width="0.33*"/>
          <ColumnDefinition Width="0.77*"/>
        </Grid.ColumnDefinitions>
        <Image HorizontalAlignment="Left" Margin="0" Source="{Binding ImagePath}" Height="200"/>
        <StackPanel Margin="5,0,0,0" Grid.Column="1">
          <TextBlock x:Name="Name" TextWrapping="Wrap" Text="{Binding Name}" Style="{StaticResource PhoneTextTitle2Style}"/>
          <TextBlock x:Name="Comment" Margin="0,5,0,0" TextWrapping="Wrap" Text="{Binding Comment}" Style="{StaticResource PhoneTextNormalStyle}" Height="130"/>
          <TextBlock x:Name="When" TextWrapping="Wrap" Text="{Binding When}" Style="{StaticResource PhoneTextTitle3Style}" VerticalAlignment="Bottom"/>
        </StackPanel>
      </Grid>
    </DataTemplate>
  </ListBox.ItemTemplate>
</ListBox>

我正在使用它来填充Loaded事件中的ListBox:

this.WallList.ItemsSource = StartingWall.GetWallPosts();

现在,当用户在TextBox上写下一些文本并单击按钮时,我想以编程方式添加更多项目。我想将此文本放在评论栏中。

我正在使用默认数据来填充其余字段。

我的问题是:

如何向WallList ListBox添加更多项目?

有人建议做以下事情:

public ObservableCollection<WallPostEntry> MyWallPosts {get;set;}

// Initialize MyWallPosts to whatever

MyWallPosts.Add(new WallPostEntry("new entry"));

<ListBox Margin="10,10,8,8" x:Name="WallList" ItemsSource="{Binding MyWallPosts}">

但是绑定ListBox ItemsSource对我不起作用。我正在构造函数上初始化MyWallPosts,就在InitializeComponent();之前,就像这样:

public Wall()
{
    MyWallPosts = StartingWall.GetWallPosts();
    InitializeComponent();
}

有什么建议吗?

感谢。

2 个答案:

答案 0 :(得分:3)

我看到了几件奇怪的事情:

首先,您在一个地方使用itemssource绑定,但是在另一个地方显式设置它?在代码中设置内容将覆盖/撤消任何绑定,因此可能会导致问题(但看起来你将它设置为相同的东西,所以不应该有所作为,但我会删除this.WallList。 ItemsSource = StartingWall.GetWallPosts();完全调用,并在Xaml中保留ItemsSource =“{Binding MyWallPosts}”。使用绑定的目的是摆脱这种代码)

第二,您正在设置mywallposts并使用绑定,但不在对象本身上设置 datacontext ?在您的示例中,最简单的方法是在构造函数中添加一行:

public Wall() 
{ 
    DataContext = this;
    MyWallPosts = StartingWall.GetWallPosts(); 
    InitializeComponent(); 
} 

我的下一个建议是简化直到它起作用。离开列表框但注释掉所有项目/数据模板,以确保您的模板中没有错误

答案 1 :(得分:0)

他可以添加吗? 一个DataContext属性:

<ListBox Margin="10,10,8,8" x:Name="WallList" ItemsSource="{Binding MyWallPosts}">

这样:

<ListBox Margin="10,10,8,8" x:Name="WallList" ItemsSource="{Binding MyWallPosts}" DataContext="{Binding MyWallPosts}">

是否可以通过声明方式设置dataContext?

TKS, 奥斯卡