user975369
user975369

Reputation: 1

Lost in the listbox data binding

I am trying to do something which I thought would be really simple, but.. I have created a pivot application and inserted a listbox in MainPage.xaml

< ListBox x:Name = "partyList" Margin = "0,0,-12,0" > 
< ListBox.ItemTemplate > 
    < DataTemplate > 
        < StackPanel Orientation = "Horizontal" Margin = "0,0,0,17" > 
            < StackPanel Width = "311" > 
                < TextBlock Text = "{Binding throwLocation}" 
                           TextWrapping = "Wrap" 
                  Style = "{StaticResource PhoneTextExtraLargeStyle}" /> 
                < TextBlock Text = "{Binding throwText}" 
                            TextWrapping = "Wrap" 
                            Margin = "12,-6,12,0" 
                Style = "{StaticResource PhoneTextSubtleStyle}" /> 
            </ StackPanel > 
        </ StackPanel > 
    </ DataTemplate > 
 </ ListBox.ItemTemplate > 
</ ListBox > 

I want to fill something in that listbox.. and have created an ObservableCollection in mainpage.xaml.cs and figured I could just point ItemsSource to that, but nothing shows up in the list.

    public class ListItems
    {
        public string throwText;
        public string throwLocation;
    }

    List<ListItems> listItems = new List<ListItems>();
    public ObservableCollection<ListItems> oblItems = 
                      new ObservableCollection<ListItems>();

    // Load data for the ViewModel Items
    private void MainPage_Loaded(object sender, RoutedEventArgs e)
    {

        ListItems li = new ListItems();
        //li.thumb = new BitmapImage();

        li.throwLocation = "Denmark. Åbenrå";
        li.throwText = "Throw text";
        oblItems.Add(li);

        partyList.DataContext = oblItems; // Don't know if this makes any sense? 
        partyList.ItemsSource = oblItems;

        MessageBox.Show(oblItems[0].throwLocation);
    }

I get the messagebox and I can see that the data has reached the oblItems collection, but nothing in the listbox.

What I am doing wrong? I thought this should be quite simple.

Upvotes: 0

Views: 350

Answers (2)

Darkside
Darkside

Reputation: 1739

OK, the answer to your question comes in two parts, one the reason why your binding fails and then a tip. The reason your data doesn't display is because the two properties in your "ListItems" class are not declared properly, they need to be fully declared properties using Getters and Setters, like this:

    public class ListItems
{
    public string throwText  { get; set; }
    public string throwLocation { get; set; }
}

Simply put unless you expose the values properly then Silverlight is unable to Bind and request the data properly.

Now for a hint If you fire up the DataBound template with the Windows Phone SDK you will see a better way of doing this by using MVVM (a framework fro proper data binding) where you separate out the view (the XAML), the Model (what you data looks like, e.g. your properties) and the data. MVVM is a more data / type safe way of designing applications that display data through data binding. Once you've looked through that I also suggest looking at frameworks such as MVVMLight (http://mvvmlight.codeplex.com) or Calburn.Micro (http://caliburnmicro.codeplex.com)to set you in good stead for the future.

Hope this helps.

Upvotes: 1

Kevin Holditch
Kevin Holditch

Reputation: 5303

You need to call databind on the list: partyList.DataBind(). This is what cUses the items to actually be added to the list.

Upvotes: 0

Related Questions