我无法在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.
答案 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。FirstName
和LastName
需要至少具有吸气剂的公共财产
2.除非您明确设置窗口的DataContext
,否则您的列表也应该是公共财产
3.需要设置DataContext
或引用来源。
4.你不能绑定到这样的静态属性,使用{x:Static ...}
这不是一个棘手的约束 - .-
正如devdigital所说,您可能也希望实现这些接口。
答案 2 :(得分:0)
您只能绑定到属性,因此请将公共字段更改为属性。
此外,如果您希望UI更新人员实例的程序化更改,请在您的People类型上实现INotifyPropertyChanged
(实际上该类型应称为Person)。
如果您希望在从DataSource人员集合中添加/删除项目时更新UI,请使用ObservableCollection<T>
而不是List<T>
。