0

我还是个新手,正在尝试我的第一个严肃的数据绑定。我已经阅读了很多关于它是如何工作的,我只是在努力解决这个具体的例子。我试图阅读我能找到的所有链接,但大多数来源在关键点上往往有点不精确。所以这里是:

-我的应用程序动态生成一个“List”类型的变量“PlayerList”,其中“Player”是一个复杂对象。

-我想通过绑定在 ListBox 中显示它。显然,由于 Player 是一个复杂的对象,我想为它创建一个 DataTemplate。所以我在'Window1.xaml'中有这样的东西:

<ListBox 
    Name="ListBox_Players" 
    ItemsSource="{Binding Source={StaticResource PlayerListResource}}"
    ItemTemplate="{StaticResource PlayerTemplate}">
</ListBox>  

和'App.xaml'中的类似内容:

<DataTemplate x:Key="PlayerTemplate">  <!-- DataType="{x:Type Player}" --> 
    <StackPanel Orientation="Horizontal">
      <TextBlock Text="{Binding Path=name}"/>
      <TextBlock Text=", "/>
      <TextBlock Text="{Binding Path=nrOfTabls}"/>
    </StackPanel>
</DataTemplate>

当然,这个模板以后会变得更加冗长。所以正如你在上面看到的,我试图为 PlayerList 变量创建一个资源,但还没有管理,即 smthn。像这样

<src: XXX x:Key="PlayerListResource"/>

据我了解,对于 XXX,我应该输入 Resource 变量的类。我试过了

List<Player>, List<src:Player>

等等,但是obv。XAML 对“<,>”字符有问题。

我还有另一个问题:通过不声明资源而是通过直接绑定(即在 C# 中编写“ListBox_Players.ItemsSource=PlayerList;”)并删除“ItemTemplate”声明并覆盖 Player 类的 ToString() 方法以输出我已经设法看到绑定有效的播放器的名称(即,我在列表框中获得了播放器名称的列表)。但是,如果我再次插入模板,它只显示','我的模板不起作用!

4

1 回答 1

1

你得到的只是逗号而没有其他任何东西的事实向我表明,要么成员的名字与中的Player名字不匹配(我曾经遇到过这个问题),要么相关的成员无法访问。Path=DataTemplatePlayer

到目前为止,我刚刚测试了您所显示的代码,它似乎工作正常。我所做的唯一更改是更改此行:

ItemsSource="{Binding Source={StaticResource PlayerListResource}}"

到这一行:

ItemsSource = "{Binding}"

这告诉程序它将在运行时获取 ItemsSource。

我的Player课是:

class Player {
    public string name { get; set; }
    public int nrOfTabls { get; set; }
}

我的MainWindow.xaml.cs是:

public partial class MainWindow : Window {
    private ObservableCollection<Player> players_;

    public MainWindow() {
        InitializeComponent();

        players_ =new ObservableCollection<Player> () {
            new Player() {
                name = "Alex",
                nrOfTabls = 1,
            },
            new Player() {
                name = "Brett",
                nrOfTabls = 2,
            },
            new Player() {
                name="Cindy",
                nrOfTabls = 231,
            }
        };

        ListBox_Players.ItemsSource = players_;
    }
}
于 2012-07-30T14:22:11.347 回答