我怎样才能数据绑定到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()方法将被调用来获取值。 这在很多情况下非常方便。 但请注意,不会发生更改通知。