WPF数据绑定与集合对象

时间:2010-05-27 07:13:11

标签: wpf data-binding collections

唉,虽然我一直在谷歌上搜索,但我真的很感激,如果有人可以解决我的问题,因为网上的所有代码示例都让我感到困惑,而不是协助(也许是为时已晚)......

我有一个如下定义的简单类:

public class Person
{
    int _id;
    string _name;

    public Person()
    { }

    public int ID
    {
        get { return _id; }
        set { _id = value; }
    }

    public string Name
    {
        get { return _name; }
        set { _name = value; }
    }
}

存储在数据库中,并通过更多代码将其放入ObservableCollection对象中,以便稍后尝试在WPF中进行数据绑定:

 public class People : ObservableCollection<Person>
{
    public People() : base() { }

    public void Add(List<Person> pListOfPeople)
    {
        foreach (Person p in pListOfPeople) this.Add(p);
    }
}

在XAML中,我自己有一个ListView,我希望为“People”对象中的每个项目填充ListViewItem(由文本块组成),因为它从数据库中更新。我还希望该文本块绑定到Person对象的“Name”属性。

我起初认为我可以这样做:

lstPeople.DataContext = objPeople;

其中lstPeople是我的XAML中的ListView控件,但那当然什么也没做。我在网上找到了大量的例子,人们通过XAML创建了一个对象,然后通过他们的XAML绑定到它;但不是我们绑定到实例化对象并相应地重新绘制的那个。

有人可以给我一些指示:

A)如何将ListView控件绑定到我实例化的“People”集合对象?

B)我如何将模板应用于ListView以便为集合中的对象设置格式?

即使链接到一个体面的例子(不是一个操作在XAML中声明的对象),将不胜感激。

感谢您的时间。

3 个答案:

答案 0 :(得分:6)

你太近了。

lstPeople.ItemsSource = objPeople; // :)

您需要的唯一其他方法是如何为集合中的每个项目应用视图。没问题。我不会使用ListView ...我只是使用ItemsControl,因为它更简单。

<ItemsControl x:Name="lstPeople">
    <ItemsControl.ItemTemplate>
         <DataTemplate>
              <TextBlock Text="{Binding Name}" />
         </DataTemplate>
    </ItemsControl.ItemTemplate>
</ItemsControl>

这就是它。 Listview的策略是相同的,但是您需要提供更多的XAML来提供列标题和内容。我不是百分之百确定你现在需要这个,所以我把它留了出来。

编辑:以下是“AddRange”的扩展方法,它将通过继承ObservableCollection来完成您要执行的操作。更容易......特别是如果你最终收集了很多类型(你会)

public static void AddRange<T>(this ObservableCollection<T> collection, IEnumerable<T> items)
{
     foreach(var item in items)
     {
          collection.Add(item);
     }
}

然后你可以这样做:

ObservableCollection<Person> peeps = new ObservableCollection<Person>();
peeps.AddRange(new List<Person>
{ 
     new Person() { Name = "Greg" }, 
     new Person() { Name = "Joe" } 
});

答案 1 :(得分:0)

答案 2 :(得分:0)

确实'安德森艾姆斯'的回答是正确的(upvote),尽管我有两个评论:

首先,如果您只需要显示一个对象的一个​​属性,我认为使用ListBox而不是ListView更容易,更清晰,因为绑定属性的代码将减少为< / p>

<ListBox x:Name="lstPeople" DisplayMemberPath="Name" />

其次,如果您正在使用WPF和Binding,请确保您的对象实现 INotifyPropertyChanged ,以便在UI和对象之间始终同步更改。

public class Person : INotifyPropertyChanged
{
    int _id;
    string _name;

    public Person()
    { }

    public int ID
    {
        get { return _id; }
        set { 
             _id = value; 
             RaisePropertyChanged("ID");
            }
    }

    public string Name
    {
        get { return _name; }
        set { 
             _name = value;  
             RaisePropertyChanged("Name");
            }
    }

    pivate void RaisePropertyChanged(string propName)
    {
        if (PropertyChanged != null)
            PropertyChanged(this, new PropertyChangedEventArgs(propName));
    }

}