为了解决这个问题,当父视图创建子视图时,让它在创建时在视图模型中注入一个“remove”命令,如下所示。
//Parent
var model = new ChildControlViewModel();
var view = new ChildControl(model);
Children.Add(view);
model.RemoveCommand =()=>Children.Remove(view);
显然,这是大量简化,同时我会确保你有一个视图控件工厂是关系到一个视图模型,甚至在代码中有此背后,似乎......我错了。
另外,您可以使用messenger并注册消息,也可以通过视图模型的操作来接受视图。例如,我使用它在我的一个项目中注册视图 - >查看缩放滑块的交互。这种方法可以用于清除。
public FlickrPhotoBrowserViewModel()
{
Photos = new ObservableCollection<FlickrPhotoViewModel>();
Messenger.Default.Register<ZoomChangedMessage>(this, message => ImageSize = message.Content);
}
当我创建照片:
public async Task CreatePhotoContainerAsync(string photoID, IImageSearchService searchService, IStreamService streamService)
{
if (photoID != null)
{
var Photo = new FlickrPhotoViewModel(photoID);
Photo.ShowDetailsCommand = new RelayCommand(() =>
{
FlickrPhotoDataViewer.ShowPhoto(photoID, searchService, streamService);
});
// REMOVE CODE!!! ^_^
Photo.RemovePhotoCommand= new RelayCommand(() =>
{
Photos.Remove(Photo);
FlickrPhotoDataViewer.CleanupPhotoElement(Photo);
});
// REMOVE CODE!!! ^_^
//update async collection from bound UI thread
DispatcherHelper.CheckBeginInvokeOnUI(() => Photos.Add(Photo));
var target = await searchService.GetPhotoThumbnailUriAsync(photoID);
Photo.ImageStream = await streamService.GetStreamAsync(target);
Debug.WriteLine("Image Download Complete " + target);
}
else
{
Debug.WriteLine("Image NULL " + photoID);
}
}
完全绕过MVVM先生的方式。你已经成功地破坏了这个模式。 – Firoso 2011-03-17 17:22:22