从 XML 加载数据 (WPF)
本文关键字:WPF 数据 XML 加载 | 更新日期: 2023-09-27 18:34:25
目前我直接从我的 xaml.cs 文件加载数据,但我现在想让它从 XML 文件加载,因为我目前不知道如何做到这一点我想知道人们是否可以帮助我,这些是我当前的文件:
enter code here
//Create a viewmodel and add some data to it.
var viewModel = new MyViewModel();
viewModel.Items.Add(new Data() { Name = "Yes", Type = "Yes", Selected = true });
viewModel.Items.Add(new Data() { Name = "Yes", Type = "No", Selected = true });
viewModel.Items.Add(new Data() { Name = "No", Type = "No", Selected = true });
viewModel.Items.Add(new Data() { Name = "Yes", Type = "No", Selected = true });
viewModel.Items.Add(new Data() { Name = "No", Type = "No", Selected = true });
viewModel.Items.Add(new Data() { Name = "No", Type = "No", Selected = true });
viewModel.Items.Add(new Data() { Name = "No", Type = "No", Selected = true });
viewModel.Items.Add(new Data() { Name = "No", Type = "No", Selected = true });
viewModel.Items.Add(new Data() { Name = "No", Type = "No", Selected = true });
viewModel.Items.Add(new Data() { Name = "Unknown", Type = "No", Selected = true });
viewModel.Items.Add(new Data() { Name = "Yes", Type = "No", Selected = true });
viewModel.Items.Add(new Data() { Name = "Yes", Type = "No", Selected = true });
viewModel.Items.Add(new Data() { Name = "No", Type = "No", Selected = true });
viewModel.Items.Add(new Data() { Name = "Yes", Type = "No", Selected = true });
viewModel.Items.Add(new Data() { Name = "No", Type = "No", Selected = true });
viewModel.Items.Add(new Data() { Name = "No", Type = "No", Selected = true });
//Set the window's datacontext to the ViewModel. This will make binding work.
this.DataContext = viewModel;
}
}
//This is the ViewModel used to bind data
public class MyViewModel
{
//This could just be a List<Data> but ObservableCollection<T> will automatically
//update UI when items are added or removed from the collection.
public ObservableCollection<Data> Items { get; set; }
public MyViewModel()
{
Items = new ObservableCollection<Data>();
}
}
//Just a sample class to hold the data for the grid.
//This is the class that is contained in the ObservableColleciton in the ViewModel
public class Data
{
public string Name { get; set; }
public string Type { get; set; }
public bool Selected { get; set; }
}
//This is an example converter. It looks to see if the element is set to "Yes"
//If so, it returns Visibility.Collapsed. Otherwise, it returns Visibility.Visible.
public class YesToVisibilityConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
if (value != null && value is string)
{
var input = (string)value;
if (string.Equals(input, "Yes", StringComparison.CurrentCultureIgnoreCase))
{
return Visibility.Collapsed;
}
else
{
return Visibility.Visible;
}
}
return Visibility.Visible;
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}
}
您可以利用 XLinq 从 XML 数据序列化/反序列化。
例如:
序列化
public static String ToXml(ObservableCollection<Data> items)
{
try
{
XElement _items = new XElement("Root",
from item in items()
select new XElement("Item",
new XElement("Name", item.OrderId),
new XElement("Type", item.OrderType),
new XElement("Selected", item.Security)
)
);
return _items.ToString();
}
catch (Exception ex)
{
}
return String.Empty;
}
反序列化
public static ObservableCollection<Data> FromXml(String data)
{
ObservableCollection<Data> dataCollection = default(ObservableCollection<Data>);
try
{
XElement _items = XElement.Parse(data);
var items = _items.Elements("Item").Select(i
=>
new Data
{
Name = i.Element("Name").Value,
Selected = bool.Parse(i.Element("Selected").Value),
Type = i.Element("Type").Value,
}
).ToArray();
if (items != null)
{
dataCollection = new ObservableCollection<Data>();
foreach (var item in dataCollection)
{
dataCollection.Add(item);
}
return dataCollection;
}
}
catch (Exception e)
{
}
return null;
}
您可以将上述函数与File.ReadAllText,File.WriteAllText一起使用,以将字符串读/写到文件中。