C#WPF MVVM无法显示列表元素

时间:2015-12-08 21:06:30

标签: c# wpf xaml mvvm

我试图用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; }

尝试了一些具有约束力的东西,但没有一个有效:/

2 个答案:

答案 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,这会更详细地解释它:)