簡體   English   中英

問題數據綁定列表框

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM