我怎样才能数据绑定到WPF / WP7中的列表框的string列表?

我正在尝试将一个string值列表绑定到一个列表框,以便它们的值逐行列出。 现在我用这个:

<ListBox Margin="20" ItemsSource="{Binding Path=PersonNames}"> <ListBox.ItemTemplate> <DataTemplate> <StackPanel Orientation="Horizontal"> <TextBlock Text="{Binding Path=Id}"></TextBlock> </StackPanel> </DataTemplate> </ListBox.ItemTemplate> </ListBox> 

但我不知道我应该把什么文本块,而不是Id ,因为它们都是string值,而不是自定义类。

另外它抱怨不必在MainPage中findPersonName,就像MainPage.PersonNames一样。

我将数据上下文设置为:

 DataContext="{Binding RelativeSource={RelativeSource Self}}" 

我做错了吗?

如果简单地说你的ItemsSource是这样绑定的:

 YourListBox.ItemsSource = new List<String> { "One", "Two", "Three" }; 

你的XAML应该是这样的:

 <ListBox Margin="20" Name="YourListBox"> <ListBox.ItemTemplate> <DataTemplate> <StackPanel Orientation="Horizontal"> <TextBlock Text="{Binding}" /> </StackPanel> </DataTemplate> </ListBox.ItemTemplate> </ListBox> 

更新:

这是使用DataContext的解决scheme。 以下代码是您将传递给页面的DataContext和DataContext设置的视图模型:

 public class MyViewModel { public List<String> Items { get { return new List<String> { "One", "Two", "Three" }; } } } //This can be done in the Loaded event of the page: DataContext = new MyViewModel(); 

你的XAML现在看起来像这样:

 <ListBox Margin="20" ItemsSource="{Binding Items}"> <ListBox.ItemTemplate> <DataTemplate> <StackPanel Orientation="Horizontal"> <TextBlock Text="{Binding}" /> </StackPanel> </DataTemplate> </ListBox.ItemTemplate> </ListBox> 

这种方法的优点是可以在MyViewModel类中放置更多的属性或复杂对象,并将它们提取到XAML中。 例如,要传递一个Person对象列表:

 public class ViewModel { public List<Person> Items { get { return new List<Person> { new Person { Name = "P1", Age = 1 }, new Person { Name = "P2", Age = 2 } }; } } } public class Person { public string Name { get; set; } public int Age { get; set; } } 

而XAML:

 <ListBox Margin="20" ItemsSource="{Binding Items}"> <ListBox.ItemTemplate> <DataTemplate> <StackPanel Orientation="Horizontal"> <TextBlock Text="{Binding Path=Name}" /> <TextBlock Text="{Binding Path=Age}" /> </StackPanel> </DataTemplate> </ListBox.ItemTemplate> </ListBox> 

希望这可以帮助! 🙂

你应该向我们展示PersonNames的代码,我不确定,我理解你的问题,但也许你想要这样绑定它:

 <TextBlock Text="{Binding Path=.}"/> 

要么

 <TextBlock Text="{Binding"} /> 

这将绑定到列表中的当前元素。 (假设PersonNames是一个string列表)。 否则,您将在列表中看到类名

如果项目源是可枚举为string项,请使用以下命令:

 <TextBlock Text="{Binding}"></TextBlock> 

你可以在任何对象上使用这个语法。 通常,ToString()方法将被调用来获取值。 这在很多情况下非常方便。 但请注意,不会发生更改通知。