开发者

ListBox ItemsSource Binding doesn't work

I'm developing a Windows Phome application. I have the following ListBox on a page:

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

I'm using this to fill the ListBox on Loaded event:

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

And now I want to add more items programmatically when the user write down some text on a TextBox and click on a button. I want to place this text on Comment field.

I'm gooing to fill the rest fields with default data.

My question is:

How can I add more items to WallList ListBox?

Someone has suggested to do the following:

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

But Binding ListBox ItemsSource does开发者_开发技巧n't work for me. I'm initializing MyWallPosts on constructor, just before InitializeComponent();, like this:

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

Any advice?

Thanks.


I see a couple wierd things:

first, you're using the itemssource binding in one place, but explicitly setting it in another? setting something in code will override/undo any bindings, so that could cause a problem (but it looks like you're setting it to the same thing so that shouldn't make a difference, but i'd remove the this.WallList.ItemsSource = StartingWall.GetWallPosts(); call entirely, and leave the ItemsSource="{Binding MyWallPosts}" in the xaml. the point of using bindings is to get rid of this kind of code)

second, you're setting mywallposts and using a binding, but not setting the datacontext on your object itself? simplest in your example would be to just add one line to your constructor:

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

My next suggestion would be to simplify until it works. leave the listbox but comment out all of the item/data templating to make sure that you don't have a bug in your template


Could he just add a DataContext property to this:

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

so:

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

Would there be any way of setting the dataContext declarativelly?

tks, Oscar

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜