【问题标题】:MVVM Saving xDoc file exceptionMVVM 保存 xDoc 文件异常
【发布时间】:2011-06-24 18:23:31
【问题描述】:

我正在尝试通过将示例 WPF 应用程序转换为 MVVM 来学习 c#/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);
    }

谢谢

【问题讨论】:

    标签: c# wpf mvvm linq-to-xml


    【解决方案1】:

    ICollectionView(不应在您的 VM 中引用)包含一堆 MediaItemViewModel。

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

    因此,您需要获取由给定MediaItemViewModel 包装的MediaItem。您没有包含该代码,因此我无法告诉您原始 MI 的存储位置。

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

    【讨论】:

    • 是的!你的回答会不会很好用。随着我了解更多,我会为 ICollectionView 寻找更好的位置 - 再次感谢
    猜你喜欢
    • 2020-02-08
    • 1970-01-01
    • 1970-01-01
    • 2014-02-13
    • 2010-12-15
    • 1970-01-01
    • 1970-01-01
    • 2015-06-23
    • 1970-01-01
    相关资源
    最近更新 更多