views:

894

answers:

2

I am loading values for a listbox from an xml file. What my problem is i can't get the bindings show the property values of the class that each item is assigned. When i set the Text this way:

<TextBlock Text="{Binding }" Style="{StaticResource TitleBlock}"></TextBlock>

The items show the toString value of the class, but if i use:

 <TextBlock Text="{Binding Title}" Style="{StaticResource TitleBlock}"></TextBlock>

I get blank space for each Item in the list box. I hope i have explained my problem well enough. Code posted below:

MapList.xml

<Maps>
 <map>
  <title>Backlot</title>
  <id>mp_backlot</id>
  <description>Daytime urban combat.</description>
  <thumbnail>mapImages/map11.jpg</thumbnail>
 </map>
 <map>
  <title>Bloc</title>
  <id>mp_bloc</id>
  <description>Snowy close quarters combat with some sniping available.</description>
  <thumbnail>mapImages/map11.jpg</thumbnail>
 </map>
 <map>
  <title>The Bog</title>
  <id>mp_bog</id>
  <description>Night time map great for any play style.</description>
  <thumbnail>mapImages/map11.jpg</thumbnail>
 </map>
</Maps>

MainPage.xaml :

    <UserControl
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
    mc:Ignorable="d" xmlns:controls="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls" x:Class="Cod4ServerTool.MainPage" Height="521" Width="928">


  <Grid x:Name="LayoutRoot">
        <Grid.RowDefinitions>
            <RowDefinition Height="0"/>
            <RowDefinition/>
        </Grid.RowDefinitions>
   <Grid.Background>
    <ImageBrush Stretch="Uniform" ImageSource="ui_bg.jpg"/>
   </Grid.Background>
   <controls:TabControl Margin="0,8,0,0" Grid.Row="1">
    <controls:TabControl.Background>
     <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">
      <GradientStop Color="White" Offset="0"/>
      <GradientStop Color="#662A2C12" Offset="1"/>
     </LinearGradientBrush>
    </controls:TabControl.Background>
    <controls:TabItem Header="TabItem" Foreground="Black">
     <Grid>
      <ListBox x:Name="MapsList_lb" Margin="8,8,177,8">
                        <ListBox.ItemTemplate>
                            <DataTemplate>
                                <StackPanel Orientation="Horizontal">
                                    <Image Source="{Binding ThumbNail}" Style="{StaticResource ThumbNailPreview}"></Image>
                                    <TextBlock Text="{Binding Title}" Style="{StaticResource TitleBlock}"></TextBlock>
                                </StackPanel>
                            </DataTemplate>
                        </ListBox.ItemTemplate>
                        <ListBox.Background>
        <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">
         <GradientStop Color="#66F0F2F0" Offset="0.254"/>
         <GradientStop Color="#CC828C82" Offset="1"/>
         <GradientStop Color="#CCD5DED6"/>
        </LinearGradientBrush>
       </ListBox.Background>
      </ListBox>
      <ListBox Margin="0,8,8,8" HorizontalAlignment="Right" Width="160">
       <ListBox.Background>
        <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0">
         <GradientStop Color="#66F0F2F0" Offset="0.254"/>
         <GradientStop Color="#CC828C82" Offset="1"/>
         <GradientStop Color="#CCD5DED6"/>
        </LinearGradientBrush>
       </ListBox.Background>
      </ListBox>
     </Grid>
    </controls:TabItem>
    <controls:TabItem Header="TabItem">
     <Grid/>
    </controls:TabItem>
   </controls:TabControl>
   <Button Height="21" HorizontalAlignment="Right" Margin="0,8,8,0" VerticalAlignment="Top" Width="95" Content="Import Maps" Grid.Row="1" Click="Button_Click"/>
    </Grid>
    </UserControl>

the .cs


    using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;

using System.Xml.Linq;

namespace Cod4ServerTool
{
    public partial class MainPage : UserControl
    {
        public MainPage()
        {
            InitializeComponent();
        }

        private void Button_Click(object sender, RoutedEventArgs e)
        {
            DisplayMaps("MapList.xml");
        }

        private void DisplayMaps(string xmlContent)
        {
            XDocument xmlMaps = XDocument.Load(xmlContent);

            var maps = from map in xmlMaps.Elements("Maps").Elements("map")
                          select new Map
                          {
                              Id = map.Element("id").Value,
                              Title = map.Element("title").Value,
                              Description = map.Element("description").Value,
                              ThumbNail = map.Element("thumbnail").Value,
                          };

            MapsList_lb.SelectedIndex = -1;
            MapsList_lb.ItemsSource = maps;
        }
    }
}

Map.cs

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Cod4ServerTool
{
    class Map
    {
        public string Title { get; set; }
        public string Id { get; set; }
        public string Description { get; set; }
        public string ThumbNail { get; set; }

        public override string ToString()
        {
            return Title;
        }
    }
}
A: 

Implement interface INotifyPropertyChanged of Map class:

public class Map : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;
    private string _Title;
    public string Title
    {
        get { return _Title; }
        set
        {
            _Title = value;
            if (PropertyChanged != null)
            {
                PropertyChanged(this, new PropertyChangedEventArgs("Title"));
            }
        }
    }    
    ...
}

It will work fine after that.

Update:

Make Map class public.

bniwredyc
I tried this and my problem still persists. Could there be some sort of error in my code somewhere. I have stepped through it and it all looks fine...
Kodefoo
+1  A: 

I would make the maps variable into a List by just adding .ToList();

    private void DisplayMaps(string xmlContent)
    {
        XDocument xmlMaps = XDocument.Load(xmlContent);
        var maps = (from map in xmlMaps.Elements("Maps").Elements("map")
                      select new Map
                      {
                          Id = map.Element("id").Value,
                          Title = map.Element("title").Value,
                          Description = map.Element("description").Value,
                          ThumbNail = map.Element("thumbnail").Value,
                      }).ToList();
        MapsList_lb.SelectedIndex = -1;
        MapsList_lb.ItemsSource = maps;
    }

Edit:

D'oh! and your Map class needs to be declared public. Binding doesn't work with internal types.

The above advice to use ToList still stands, its better for ItemsSource to reference a simple List<Map> than it is to reference a LINQ query that in turns holds on to a tree of XObjects.

AnthonyWJones
I tried this and i am experiencing the same results.
Kodefoo
Heh, I found that Map isn't public at the same time (%
bniwredyc
Hah, thanks! I am brand new to Silverlight and c# (branching out from flash) so i knew it was something simple. Thank you for the fix and the extra advice.
Kodefoo