[英]Problems data binding Listbox
我的問題是如何將數據文件附加到 XAML? 以便數據 Name, Images , Age 顯示 ListBox。
有一個類人:
public string Name { get; set; }
public string Images { get; set; }
public string Age { get; set; }
有一個xml文件UsersList(約100個用戶)xml文件不斷編輯
<?xml version="1.0" encoding="utf-8" ?>
<users>
<user name="Bill Gates">
<images>https://pbs.twimg.com/profile_images/558109954561679360/j1f9DiJi.jpeg</images>
<age>48</age>
</user>
<user name="Larry Page">
<images>http://www.siliconbeat.com/wp-content/uploads/2015/06/page.jpg</images>
<age>42</age>
</user>
</users>
XAML
<ListBox x:Name="ListBox" Margin="36,10,273,0" >
<ListBox.DataContext>
<user:Person/>
</ListBox.DataContext>
<ListBox.ItemTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal" >
<Image Source="{Binding Images}" />
<TextBlock Text="{Binding Name}" />
<TextBlock Text="{Binding Age}" />
</StackPanel>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
代碼隱藏
public MainWindow()
{
InitializeComponent();
Load();
}
public void Load()
{
Person user = new Person();
XmlDocument xDoc = new XmlDocument();
xDoc.Load("UsersList");
XmlElement xRoot = xDoc.DocumentElement;
foreach (XmlNode xnode in xRoot)
{
if (xnode.Attributes.Count > 0)
{
XmlNode attr = xnode.Attributes.GetNamedItem("name");
if (attr != null)
user.Name = attr.Value;
}
foreach (XmlNode childnode in xnode.ChildNodes)
{
if (childnode.Name == "images")
{
user.Images = childnode.InnerText;
}
if (childnode.Name == "age")
{
user.Age = childnode.InnerText;
}
}
}
}
您需要將ListBox.ItemsSource
設置為可觀察的人員列表 ( ObservableCollection<Person>
) 並在Person
類上實現INotifyPropertyChanged
接口。
Person user = new Person();
應該是ObservableCollection<Person> persons = new ObservableCollection<Person>();
然后,您必須在 foreach 循環內創建一個新的Person
對象,並將其添加到人員列表中,如下所示:
persons.Add(person);
如果您在更改某人的屬性時不需要更新您的列表,那么您實際上並不需要實現INotifyPropertyChanged
接口。
您應該將 ListBox 的ItemsSource屬性設置為IEnumerable<Person>
:
public MainWindow()
{
InitializeComponent();
ListBox.ItemsSource = Load();
}
public List<Person> Load()
{
XmlDocument xDoc = new XmlDocument();
xDoc.Load("UsersList");
XmlElement xRoot = xDoc.DocumentElement;
List<Person> users = new List<Person>();
foreach (XmlNode xnode in xRoot)
{
Person user = new Person();
if (xnode.Attributes.Count > 0)
{
XmlNode attr = xnode.Attributes.GetNamedItem("name");
if (attr != null)
user.Name = attr.Value;
}
foreach (XmlNode childnode in xnode.ChildNodes)
{
if (childnode.Name == "images")
{
user.Images = childnode.InnerText;
}
if (childnode.Name == "age")
{
user.Age = childnode.InnerText;
}
}
users.Add(user);
}
return users;
}
找到下面的代碼。
class MainWindow:System.Windows.Window
{
List<Person> lstPerson;
public MainWindow()
{
InitializeComponent();
lstPerson = new List<Person>();
Load();
}
public void Load()
{
XmlDocument xDoc = new XmlDocument();
xDoc.Load("UsersList");
XmlElement xRoot = xDoc.DocumentElement;
foreach (XmlNode xnode in xRoot)
{
Person user = new Person();
if (xnode.Attributes.Count > 0)
{
XmlNode attr = xnode.Attributes.GetNamedItem("name");
if (attr != null)
user.Name = attr.Value;
}
foreach (XmlNode childnode in xnode.ChildNodes)
{
if (childnode.Name == "images")
{
user.Images = childnode.InnerText;
}
if (childnode.Name == "age")
{
user.Age = childnode.InnerText;
}
}
lstPerson.Add(user)
}
ListBox.itemsSource= lstPerson
}
}
下面是 Xaml 部分
<ListBox x:Name="ListBox" Margin="36,10,273,0" >
<ListBox.ItemTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal" >
<Image Source="{Binding Images}" />
<TextBlock Text="{Binding Name}" />
<TextBlock Text="{Binding Age}" />
</StackPanel>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
對於圖像源綁定
您不能提供 http 地址作為圖片來源。 在這里,您需要一個轉換器,它可以從網絡下載圖像並創建圖像並返回源。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.