Как вы связываете данные в ObservableCollection с вложенным ObservableCollection? - PullRequest
1 голос
/ 01 марта 2011

Каков наилучший способ сделать ViewModel из xml-кода, например:

<Cars>
 <Car>
   <Name/>
   <Model/>
   <Parts>
     <Part>
         <PartName/>
         <PartType/>
     </Part>
     <Part>
         <PartName/>
         <PartType/>
     </Part>
   </Parts>
 </Car>
</Cars>

будет выглядеть как

public class PartViewModel : INotifyPropertyChanged
{
    private string _PartName;
    private string _PartType;
    //... and proper get/seters for NotifyPropertyChanged
};

public class CarViewModel : INotifyPropertyChanged
{
    private string _Name;
    private string _Model;
    private ObservableCollection<PartViewModel> _parts;
    //... and proper get/seters for NotifyPropertyChanged
};

, тогда как LINQ будет выглядеть для заполнения CarViewModel?

 List<CarViewModel> FeedItems = (from carsXdoc in xdoc.Descendants("Cars")
                                 select new CarViewModel()
                                 {
                                     Name = carsXdoc.Element("Name").Value,
                                     Model = carsXdoc.Element("Model").Value,
// And then ? how do you fill nested observable collection with parts ?
                                 }).ToList();

Ответы [ 2 ]

3 голосов
/ 01 марта 2011

Что-то вроде следующего должно сделать трюк:

List<CarViewModel> FeedItems = (from carsXdoc in xdoc.Descendants("Cars")
                                select new CarViewModel()
                                {
                                    Name = carsXdoc.Element("Name").Value,
                                    Model = carsXdoc.Element("Model").Value,
                                    Parts = ToObservableCollection(from part in carsXdoc.Element("Parts").Descendants("Part")
                                                                   select new PartViewModel()
                                                                   {
                                                                       PartName = part.Element("PartName").Value,
                                                                       PartType = part.Element("PartType").Value,
                                                                   })
                                }).ToList();

ToObservableCollection() метод:

ObservableCollection<T> ToObservableCollection<T>(IEnumerable<T> sequence)
{
    ObservableCollection<T> collection = new ObservableCollection<T>();
    foreach (var item in sequence)
    {
        collection.Add(item);
    }

    return collection;
}
1 голос
/ 01 марта 2011

Это должно быть достаточно просто - просто сделайте другой вложенный запрос LINQ внутри select - вы можете затем использовать конструктор ObservableCollection, который принимает и IEnumerable.

Чтобы сохранить свое здравомыслие, вы можете разделить это на отдельную функцию!

...