Ran*_*ter 9 data-binding collections wpf
哎呀,虽然我一直在谷歌搜索,我真的很感激,如果有人可以打破我的问题,因为在线的所有代码示例让我困惑,而不是协助(也许它只是迟到)...
我有一个简单的类定义如下:
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; }
}
}
Run Code Online (Sandbox Code Playgroud)
存储在数据库中,并通过一些代码我将它放入一个ObservableCollection对象,以便稍后尝试在WPF中进行数据绑定:
public class People : ObservableCollection<Person>
{
public People() : base() { }
public void Add(List<Person> pListOfPeople)
{
foreach (Person p in pListOfPeople) this.Add(p);
}
}
Run Code Online (Sandbox Code Playgroud)
在XAML中,我自己有一个ListView,我希望为"People"对象中的每个项目填充ListViewItem(由文本块组成),因为它从数据库中更新.我还希望该文本块绑定到Person对象的"Name"属性.
我一开始以为我能做到这一点:
lstPeople.DataContext = objPeople;
Run Code Online (Sandbox Code Playgroud)
其中lstPeople是我的XAML中的ListView控件,但那当然什么也没做.我在网上找到了大量的例子,人们通过XAML创建了一个对象,然后通过他们的XAML绑定到它; 但不是我们绑定到实例化对象并相应地重新绘制的对象.
有人可以给我一些指示:
A)如何将ListView控件绑定到我实例化的"People"集合对象?
B)我如何将模板应用于ListView以将其格式化为集合中的对象?
甚至链接到一个体面的例子(不是一个操作在XAML中声明的对象)将不胜感激.
谢谢你的时间.
你是如此亲密.
lstPeople.ItemsSource = objPeople; // :)
Run Code Online (Sandbox Code Playgroud)
您需要的唯一其他方法是如何为集合中的每个项目应用视图.没问题.我不会使用ListView ...我只会使用ItemsControl,因为它有点简单.
<ItemsControl x:Name="lstPeople">
<ItemsControl.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding Name}" />
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
Run Code Online (Sandbox Code Playgroud)
这就是它.Listview的策略是相同的,但是您需要提供更多的XAML来提供列标题和内容.我不是100%肯定你现在需要这个,所以我把它留了出来.
编辑: 这是"AddRange"的扩展方法,它将通过继承ObservableCollection来完成您要做的事情.更容易......特别是如果你最终收集了很多类型(你会)
public static void AddRange<T>(this ObservableCollection<T> collection, IEnumerable<T> items)
{
foreach(var item in items)
{
collection.Add(item);
}
}
Run Code Online (Sandbox Code Playgroud)
然后你可以这样做:
ObservableCollection<Person> peeps = new ObservableCollection<Person>();
peeps.AddRange(new List<Person>
{
new Person() { Name = "Greg" },
new Person() { Name = "Joe" }
});
Run Code Online (Sandbox Code Playgroud)