我试图用MVVM模式编写一个简单的WPF应用程序,但显示列表的元素不起作用我非常确定绑定有问题,因为它是我第一次使用它
<Window.Resources>
<local:ViewModel x:Key="test"/>
</Window.Resources>
<Grid>
<ListView Name="lstPersons" ItemsSource="{Binding test.peopleList}" >
<ListView.View>
<GridView.Columns>
<GridViewColumn Header="name" DisplayMemberBinding="{Binding name}" />
<GridViewColumn Header="surname" DisplayMemberBinding="{Binding surname}" />
查看模型片段:
public class ViewModel
{
private personModel.Root peopleDB = new personModel.Root();
public ViewModel()
{ }
public List<personModel.Person> peopleList
{
get { return peopleDB.people; }
}
模型类片段:
public class Root
{
public List<Person> people;
public Root()
{
people = new List<Person>();
people.Add(new Person("aa", "aa", 1, new Adress("bb", "cc")));
people.Add(new Person("bb", "bb", 1, new Adress("bb", "cc")));
people.Add(new Person("cc", "cc", 1, new Adress("bb", "cc")));
}
}
public class Person
{
public string name { get; set; }
public string surname { get; set; }
public int age { get; set; }
public Adress address { get; set; }
尝试了一些具有约束力的东西,但没有一个有效:/
答案 0 :(得分:1)
将DataContext添加到您的xaml文件中,将其设置为viewmodel:
<Window.DataContext>
<local:ViewModel>
</Window.DataContext>
然后,当你需要绑定一些东西时,你可以使用:
<ListView Name="lstPersons" ItemsSource="{Binding peopleList}" >
答案 1 :(得分:1)
这里的问题听起来似乎没有设置DataContext
。
有多种方法可以做到这一点。作为escull638 said,您可以使用XAML
手动对DataContext进行硬编码<Window.DataContext>
<local:ViewModel>
</Window.DataContext>
或Code-Behind
this.DataContext = new ViewModel();
并在.DataContext
设置正确
<ListView ItemsSource="{Binding peopleList}">
但请记住,像这样对.DataContext
进行硬编码通常只能在应用程序的最高级别使用,并且在使用WPF时不应该常见。 WPF中的控件是内部&#34;无表情&#34;,并且绑定系统用于将它们的数据传递给它们,因此通过执行诸如硬编码之类的操作DataContext
意味着您不能将控件与任何其他数据对象一起使用,哪种方式打败了使用WPF的最大优势之一。
另一个解决方案是更改绑定的Source
属性,使其指向<Window.Resources>
<ListView ItemsSource="{Binding Source={StaticResource test}, Path=peopleList}">
我更喜欢这种方式,因为很明显只是看着你绑定到静态源的ListView XAML,并且当你试图将动态源传递给它时,它会保存所有类型的麻烦。控制和发现DataContext不会设置为您所期望的。
作为旁注,如果您无法理解DataContext
的用途或工作原理,我倾向于将初学者链接到this answer of mine,这会更详细地解释它:)