绑定值未显示在ListBox中(silverlight 3)

时间:2009-12-09 04:50:44

标签: silverlight silverlight-3.0 binding listbox

我正在从xml文件加载列表框的值。我的问题是我无法获得绑定显示每个项目分配的类的属性值。当我以这种方式设置文本时:

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

这些项显示了类的toString值,但是如果我使用:

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

我为列表框中的每个项目获取空白。我希望我已经很好地解释了我的问题。代码发布如下:

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>

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

2 个答案:

答案 0 :(得分:1)

我只需添加.ToList(); {/ p>即可将maps变量变为List

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

修改

D'哦!并且您的Map类需要声明public。绑定不适用于内部类型。

上面使用ToList的建议仍然有效,它更好地引用一个简单的List<Map>来引用一个简单的XObject,而不是引用一个LINQ查询,而该查询又依赖于{{1}的树。 }第

答案 1 :(得分:0)

实现Map类的接口INotifyPropertyChanged:

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"));
            }
        }
    }    
    ...
}

之后它会正常工作。

更新

将地图类公开。