Чтобы решить эту проблему, когда родительское представление создает дочернее представление, попросите его ввести команду «удалить» в модель представления во время создания, как показано ниже.
//Parent
var model = new ChildControlViewModel();
var view = new ChildControl(model);
Children.Add(view);
model.RemoveCommand = ()=>Children.Remove(view);
Очевидно, что это значительно упрощено, также я бы позаботился о том, чтобы у вас была фабрика управления представлениями, которая связана с моделью представления, даже если это в коде позади кажется мне ... неправильным.
Кроме того, вы можете использовать мессенджер и регистрироваться для сообщений в качестве альтернативы, что является приемлемым способом уведомления о действии модели представления. Например, я использую это, чтобы зарегистрировать представления view-> view для ползунка масштабирования в одном из моих проектов. Этот подход МОЖЕТ быть использован для удаления.
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);
}
}