棘手的WPF绑定

时间:2011-01-13 14:30:02

标签: wpf data-binding windows-phone-7 listbox binding

我无法在Silverlight 4中进行简单但棘手的WPF绑定(WP7开发)

我有以下代码:

Class People{
    public string firstname;
    public string lastname;
}

Class DataSource{
    public static List<People> people; // consider this as a list filled with objects already
}

我正在尝试将人员列表放入ListBox,这是我尝试过的xaml:

            <ListBox x:Name="peoplelistbox" Margin="0,0,-12,0" ItemsSource="{Binding DataSource.people}">
                <ListBox.ItemTemplate>
                    <DataTemplate>
                      <StackPanel Margin="0,0,0,17" Width="432">
                            <TextBlock Text="{Binding firstname}" TextWrapping="Wrap"/>
                            <TextBlock Text="{Binding lastname}" TextWrapping="Wrap"/>
                      </StackPanel>
                    </DataTemplate>
                </ListBox.ItemTemplate>
            </ListBox>

但不幸的是我的列表框仍然是空的。我做错了什么?

提前谢谢你:)

干杯, 米卢德B.

3 个答案:

答案 0 :(得分:5)

首先,您使用的是字段,您应该使用public属性(即人员,名字和姓氏)。将people转换为公共属性,如下所示:

public static List<People> people { get; set; }

然后,您需要使用ItemsSource标记绑定x:Static,如下所示:

<ListBox x:Name="peoplelistbox" Margin="0,0,-12,0">
   <ListBox.ItemsSource>
      <Binding Source="{x:Static local:DataSource.people}"/>
   <ListBox.ItemsSource/>
   ...

PS:local是指向DataSource类命名空间的xml命名空间。此外,您的班级也需要成为公共班级。

修改
对于WP7,您需要在资源中声明类的实例,然后您可以使用Path指向源。像这样:

<phone:PhoneApplicationPage.Resources>
    <local:DataSource x:Key="dataSource"/>
</phone:PhoneApplicationPage.Resources>
...
<ListBox x:Name="peoplelistbox" Margin="0,0,-12,0" ItemsSource="{Binding Source={StaticResource dataSource}, Path=people}">

PS:同样,你的类需要是公共的,并且必须有一个默认的构造函数。

修改
这是一个在我的系统上完美运行的例子。检查并查看您在哪里犯错:

namespace WindowsPhoneApplication1
{
    public class People
    {
        public string firstname { get; set; }
        public string lastname { get; set; }
    }

    public class DataSource
    {
        public static List<People> people { get; set; }

        public DataSource() { }

        static DataSource()
        {
            people = new List<People> {new People {firstname = "Foo", lastname = "Bar"}};
        }
    }

    public partial class MainPage : PhoneApplicationPage
    {
        // Constructor
        public MainPage()
        {
            InitializeComponent();
        }
    }
}

Xaml(仅相关部分):

...
...
xmlns:local="clr-namespace:WindowsPhoneApplication1"
...
...
<phone:PhoneApplicationPage.Resources>
    <local:DataSource x:Key="dataSource"/>
</phone:PhoneApplicationPage.Resources>
...
...
<ListBox x:Name="peoplelistbox" Margin="0,0,-12,0" ItemsSource="{Binding Source={StaticResource dataSource}, Path=people}">
    <ListBox.ItemTemplate>
        <DataTemplate>
            <StackPanel Margin="0,0,0,17" Width="432">
                <TextBlock Text="{Binding firstname}" TextWrapping="Wrap"/>
                <TextBlock Text="{Binding lastname}" TextWrapping="Wrap"/>
            </StackPanel>
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>

答案 1 :(得分:1)

1。FirstNameLastName需要至少具有吸气剂的公共财产 2.除非您明确设置窗口的DataContext,否则您的列表也应该是公共财产 3.需要设置DataContext或引用来源。
4.你不能绑定到这样的静态属性,使用{x:Static ...} 这不是一个棘手的约束 - .-

正如devdigital所说,您可能也希望实现这些接口。

答案 2 :(得分:0)

您只能绑定到属性,因此请将公共字段更改为属性。

此外,如果您希望UI更新人员实例的程序化更改,请在您的People类型上实现INotifyPropertyChanged(实际上该类型应称为Person)。

如果您希望在从DataSource人员集合中添加/删除项目时更新UI,请使用ObservableCollection<T>而不是List<T>