2011-06-24 7 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.Models.MediaItem' と入力して 'mList.ViewModels.MediaItemViewModel' タイプのオブジェクトをキャストすることができません。"}

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のより良い場所を探します - もう一度ありがとう –

関連する問題