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

3
我正在从一个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>

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

请查看我的修改后的答案,Map类需要是public。 - AnthonyWJones
2个回答

1

我会通过添加 .ToList() 将 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;
    }

编辑:

糟糕!你的Map类需要声明为public。绑定不支持内部类型。

仍然建议使用ToList,最好让ItemsSource引用一个简单的List<Map>,而不是引用一个反过来保存了一棵XObject树的LINQ查询。


嘿,我发现Map不是同时公开的 (%)。 - bniwredyc
哈哈,谢谢!我对Silverlight和c#一窍不通(从flash开始学起)所以我知道这只是一个简单的问题。感谢您提供的解决方案和额外的建议。 - Paul Parker

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

之后它将正常工作。

更新:

将Map类设为公共类。


我尝试过了,但我的问题仍然存在。我的代码中可能有某种错误吗?我已经逐步检查过了,看起来都没问题... - Paul Parker

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接