Как я могу привязать XML к MVVM WPF? - PullRequest
0 голосов
/ 14 января 2019

У меня проблема. У меня есть приложение wpf mvvm, и мне нужно связать xml, но я не знаю как.

У меня есть элементы модели, элементы VM и вид. Все работает, но все эти элементы имеют "некоторую базовую" модель.

class ItemModel
{
    public ItemModel(string name, double weight, double sg, double volume)
    {

        Name = name;
        Weight = weight;
        Sg = sg;
        Volume = volume;

    }

    public string Name { get; set; }
    public double Weight { get; set; }
    public double Sg { get; set; }
    public double Volume { get; set; }

}

Это моя ВМ.

class ItemViewModel : BaseVM
{
    public ItemViewModel(string name, double sg, double weight,  double volume)
    {
        Name = name;
        Weight = weight;
        Sg = sg;
        Volume = volume;

    }

    public string Name { get; set; }

    private double _weight;
    public double Weight
    {
         get => _weight;
         set
         {
             _weight = value;

             RaisePropertyChanged();
         }
    }

    private double _sg;
    public double Sg
    {
        get => _sg;
        set
        {
            _sg = value;
            Weight = value * _volume;

            RaisePropertyChanged("Weight");
            RaisePropertyChanged("Sg");
        }
    }


    private double _volume;
    public double Volume
    {
        get => _volume;
        set
        {
            _volume = value;
            _weight = value * _sg;

            RaisePropertyChanged();
            RaisePropertyChanged("Weight");
            RaisePropertyChanged("Sg");
        }
    }
}

Это мой MainVM

class MainViewModel
{
    private DataModel Data;
    public ObservableCollection<ItemViewModel> Items { get; set; }

    public ListCollectionView FilteredItems { get; set; }


    public MainViewModel()
    {
        Data = new DataModel();
        Items = new ObservableCollection<ItemViewModel>();

    FilteredItems = new ListCollectionView(Items)
    {
        Filter = item => ((ItemViewModel)item).Volume != 0,
        IsLiveFiltering = true,
        LiveFilteringProperties =
        {
            nameof (ItemViewModel.Volume)
        }
    };

        Load();
    }

    public void Load()
    {
        foreach (var item in Data.GetItems())
            Items.Add(new ItemViewModel(item.Name, item.Weight, item.Sg, item.Volume));
    }
}

У меня есть "DataModel"

class DataModel
{
    public List<ItemModel> GetItems() =>
        new List<ItemModel>
        {
            new ItemModel("Water", 0.00, 1.025, 0.00),
            new ItemModel("Ballast", 0.00, 1.000, 0.00),
            new ItemModel("Oil", 0.00, 1.040, 0.00),
        };
}

И это XML, который я хочу связать.

<ballast>
  <tank ID="FPTW" Name="Forepeak" Weight="0.00" SG="1.025" Volume="0.00"> </tank>
</ballast>

Пожалуйста, помогите мне, как я могу связать этот XML-файл вместо списка в DataModel.

1 Ответ

0 голосов
/ 14 января 2019

Я настоятельно рекомендую десериализовать ваш XML для "реальных" объектов. В вашем примере вы хотите иметь список танков в вашей программе. Представление (XAML) не должно знать, является ли «хранилище данных» файлом XML, базой данных или чем-то еще. Просто привяжите к списку TankViewModel (или в вашем случае вы назвали его ItemViewModel. Надеюсь, вы не взорвете что-то со всеми этими танками ....

Вот как вы десериализуете xml в «реальные» объекты (полнофункциональное консольное приложение:

https://dotnetfiddle.net/zCHSmc

using System;
using System.IO;
using System.Xml.Serialization;
using System.Collections.Generic;

public class Program
{
    public static void Main()
    {

        MainViewModel vm = new MainViewModel();
        foreach(tank t in vm.ListOfTanks.ballast)
        {
            Console.WriteLine(t.ID);
        }


    }

    public class MainViewModel
    {
        public tanks ListOfTanks
        {
            get
            {
                string xmlContent = "<?xml version=\"1.0\" encoding=\"utf-16\"?><tanks xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\">  <ballast><tank><ID>ksj</ID></tank>  </ballast></tanks>";
                tanks allTanks = null;

                XmlSerializer serializer = new XmlSerializer(typeof(tanks));

                //if you have a xml file you can use serializer.Deserialize("yourFile.xml"); instead of the "in memory stream"

                using (TextReader reader = new StringReader(xmlContent))
                {
                    allTanks =(tanks)serializer.Deserialize(reader);
                }
                return allTanks;
            }
        }
    }


    public class tanks
    {
        public tanks()
        {
            ballast = new List<tank>();
        }
        public List<tank> ballast {get;set;} 
    }


    public class tank
    {
        public string ID {get;set;}
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...