2011-06-24 27 views
0

我想通过将示例WPF应用程序转换为MVVM来学习c#/ WPF/MVVM。这个应用程序打开一个XML文件进行编辑,然后保存。该应用程序预制形式,直到我试图保存该文件,我得到一个InvalidCastException。下面是一些代码
mDataSource.csMVVM保存xDoc文件异常

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); 
    } 

谢谢

回答

0

ICollectionView(这不应当被引用您的VM)包含一堆MediaItemViewModels。

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

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

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

是的!你的答案会很好吗?随着我学到更多,我会为ICollectionView寻找更好的位置 - 再次感谢 –