我的问题是如何将数据文件附加到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;
}
}
}
}
答案 0 :(得分:0)
您需要将ListBox.ItemsSource
设置为可观察的人员列表(ObservableCollection<Person>
),并在Person
课程上实施INotifyPropertyChanged
界面。
Person user = new Person();
应为ObservableCollection<Person> persons = new ObservableCollection<Person>();
然后你必须在foreach循环中创建一个新的Person
对象,并将它添加到人员列表中,如下所示:
persons.Add(person);
如果您在更改某人的属性时不需要更新列表,那么您实际上并不需要实现INotifyPropertyChanged
界面。
答案 1 :(得分:0)
您应该将ListBox的 ItemsSource 属性设置为(mainwindow.h)
#include <QTimer>
...
QTimer timer;
(mainwindow.cpp)
MainWindow::MainWindow()
{
...
connect(&timer,SIGNAL(timeout()),this,SLOT(on_timer()));
}
void MainWindow::on_tstart_clicked()
{
timer.start(1000);
}
void MainWindow::on_timer()
{
if(timer.isActive()) return;
ttime--;
(display LCD values)
if(ttime<=0)
{
ttime=0;
(emit signal for alarm or whatever you want)
timer.stop();
}
}
void MainWindow::on_tpause_clicked()
{
timer.stop();
(display LCD values)
}
void MainWindow::on_treset_clicked()
{
timer.stop();
ttime=0;
(display zeroes)
}
:
IEnumerable<Person>
答案 2 :(得分: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地址作为图片来源。在这里,您需要一个从web创建图像下载图像并返回源的转换器。