我正在尝试通过将示例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();
}xml -加载MainViewModel.cs文件
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);
}谢谢
发布于 2011-06-25 02:46:11
ICollectionView (不应该在你的VM中引用)包含了一堆MediaItemViewModels。
this.mediafiles.Add(new MediaItemViewModel(mediaitem));因此,您需要获取由给定MediaItemViewModel包装的MediaItem。您没有包含该代码,所以我不能告诉您原始MI存储在哪里。
foreach (var mediaitem in collectionView.OfType<MediaItemViewModel>())
{
MediaItem mi = mediaitem.ThisPropertyContainsTheWrappedMediaItem; https://stackoverflow.com/questions/6472143
复制相似问题