从XML(WPF)加载数据

时间:2012-05-16 12:58:30

标签: c# .net xml wpf xaml

当我直接从我的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();
    }
}

}

1 个答案:

答案 0 :(得分:2)

您可以利用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.ReadAllTextFile.WriteAllText一起使用来将字符串读/写到文件中。