2017-01-16 84 views
-1

我的问题是如何将数据文件附加到XAML? 使数据名称,图像,年龄显示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; 
        } 
       } 

      } 

     } 

回答

0

找到下面的代码。

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地址作为图像源。在这里你需要一个转换器,从网站下载图像创建图像并返回到源代码。

0

你需要设置你的ListBox.ItemsSource到人(ObservableCollection<Person>)的可观察名单,并实现你的PersonINotifyPropertyChanged接口。

Person user = new Person();应该ObservableCollection<Person> persons = new ObservableCollection<Person>();

然后,你必须创建foreach循环中一个新的Person对象,并将其添加到列表中的人是这样的:

persons.Add(person); 

如果你不需要更新你的清单,如果你改变一个人的财产,那么你并不需要实现INotifyPropertyChanged界面。

+0

正确的名字是'ObservableCollection'而不是'ObservableList',我编辑了我的答案。 –

+1

实际上,ListBox的ItemsSource必须被设置,而不是它的DataContext。如果你只设置了DataContext,你还需要像'ItemsSource =“{Binding}”''。 – Clemens

+0

@Clemens谢谢,我会更新我的答案。 –

0

你应该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; 
}