簡體   English   中英

如何將xml綁定到mvvm wpf?

[英]How can i bind xml to mvvm wpf?

我有個問題。 我有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中列出。

我強烈建議您將XML反序列化為“真實”對象。 在您的示例中,您希望在程序中有一個坦克清單。 視圖(XAML)不應該知道“數據存儲”是xml文件,數據庫還是其他。 只需綁定到TankViewModel的列表TankViewModel (或者,在您的情況下,您將其命名為ItemViewModel 。希望您不要對所有這些坦克都TankViewModel

這是您將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;}
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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