唉,虽然我一直在谷歌上搜索,但我真的很感激,如果有人可以解决我的问题,因为网上的所有代码示例都让我感到困惑,而不是协助(也许是为时已晚)......
我有一个如下定义的简单类:
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中声明的对象),将不胜感激。
感谢您的时间。
答案 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));
}
}