MVVM Сохранение файла xDoc исключение - PullRequest
0 голосов
/ 24 июня 2011

Я пытаюсь выучить c # / WPF / MVVM путем преобразования примера приложения WPF в MVVM.Это приложение открывает файл XML для редактирования, а затем сохраняет его.Приложение хорошо преформируется, пока я не пытаюсь сохранить файл, я получаю исключение InvalidCastException.Вот некоторый код
mDataSource.cs

public static List<MediaItem> Load(string filename)
    {
        var mediafiles = XDocument.Load(filename).Root.Elements("style").Elements("item").Select(
            x => new MediaItem(
                (string)x.Element("title"),
                (string)x.Element("artist"),
                (string)x.Element("year")));

        return mediafiles.ToList();
    }

MainViewModel.cs - Загрузить файл XML

public void LoadList(string filename)
    {
        this.mediafiles = new ObservableCollection<MediaItemViewModel>();

        List<MediaItem> mediabaseList = mDataSource.Load(filename);
        foreach (MediaItem mediaitem in mediabaseList)
        {
            this.mediafiles.Add(new MediaItemViewModel(mediaitem));
        }

        this.collectionView = CollectionViewSource.GetDefaultView(mediafiles);
        if (this.collectionView == null)
            throw new NullReferenceException("collectionView");

        this.collectionView.CurrentChanged += new EventHandler(this.OnCollectionViewCurrentChanged);
    }

Сохранение файла

 private void Save(ICollectionView collectionView)
    {
        mDataSource mds = new mDataSource();
        mds.Save(this.collectionView); 
    }

mDataSource -Сохраняя файл, во время отладки данные правильно отображаются везде, но в строке появляется исключение - MediaItem mi = (MediaItem) mediaitem;{"Невозможно привести объект типа 'mList.ViewModels.MediaItemViewModel' к типу mList.Models.MediaItem '."}

public void Save(ICollectionView collectionView)
    {
        XDocument xdoc = new XDocument();
        XElement xeRoot = new XElement("art");
        XElement xeSubRoot = new XElement("style");

        foreach (var mediaitem in collectionView)
        {
            MediaItem mi = (MediaItem)mediaitem; 

            XElement xRow = new XElement("item"); 
            xRow.Add(new XElement("title", mi.Title));
            xRow.Add(new XElement("artist", mi.Artist));
            xRow.Add(new XElement("year", mi.Year));
            xeSubRoot.Add(xRow);
        }
        xeRoot.Add(xeSubRoot);
        xdoc.Add(xeRoot);
        xdoc.Save(filename);
    }

Спасибо

1 Ответ

0 голосов
/ 24 июня 2011

ICollectionView (на который не следует ссылаться в вашей виртуальной машине) содержит набор MediaItemViewModels.

this.mediafiles.Add(new MediaItemViewModel(mediaitem));

Итак, вам нужно получить MediaItem, заключенный в указанный MediaItemViewModel.Вы не включили этот код, поэтому я не могу сказать вам, где хранится оригинальный MI.

foreach (var mediaitem in collectionView.OfType<MediaItemViewModel>())
{
    MediaItem mi = mediaitem.ThisPropertyContainsTheWrappedMediaItem; 
...