首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MVVM保存xDoc文件异常

MVVM保存xDoc文件异常
EN

Stack Overflow用户
提问于 2011-06-25 02:23:32
回答 1查看 195关注 0票数 0

我正在尝试通过将示例WPF应用程序转换为MVVM来学习c#/WPF/MVVM。此应用程序打开一个xml文件进行编辑,然后保存该文件。这个应用程序运行良好,直到我尝试保存文件,我得到了一个InvalidCastException。下面是一些代码

mDataSource.cs

代码语言:javascript
复制
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();
    }

xml -加载MainViewModel.cs文件

代码语言:javascript
复制
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);
    }

保存文件

代码语言:javascript
复制
 private void Save(ICollectionView collectionView)
    {
        mDataSource mds = new mDataSource();
        mds.Save(this.collectionView); 
    }

mDataSource -保存文件,调试期间数据在各处正确显示,但异常出现在行- MediaItem mi = (MediaItem)mediaitem;{“无法将类型为'mList.ViewModels.MediaItemViewModel‘的对象转换为类型’mList.Models.MediaItem.”}

代码语言:javascript
复制
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);
    }

谢谢

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-06-25 02:46:11

ICollectionView (不应该在你的VM中引用)包含了一堆MediaItemViewModels。

代码语言:javascript
复制
this.mediafiles.Add(new MediaItemViewModel(mediaitem));

因此,您需要获取由给定MediaItemViewModel包装的MediaItem。您没有包含该代码,所以我不能告诉您原始MI存储在哪里。

代码语言:javascript
复制
foreach (var mediaitem in collectionView.OfType<MediaItemViewModel>())
{
    MediaItem mi = mediaitem.ThisPropertyContainsTheWrappedMediaItem; 
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6472143

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档