绑定和DataTemplate混乱

时间:2012-07-30 14:01:38

标签: c# wpf binding

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

-My Application动态生成一个类型为'List'的变量'PlayerList',其中'Player'是一个复杂的对象。

- 我想通过Binding在ListBox中显示它。 Obvoiusly,因为Player是一个复杂的Object,我想为它创建一个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在'&lt;,&gt;'方面遇到问题字符。

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

1 个答案:

答案 0 :(得分:1)

你得到的只是逗号而没有任何其他内容这一事实告诉我Player成员的名字与Path= DataTemplate中的名字不符(我有这个问题在某一时刻),或相关的Player成员是不可访问的。

到目前为止,我刚刚测试了您的代码显示内容,它似乎运行正常。我做的唯一改变是改变这一行:

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