Передача ссылки MainWindow в метод ImageCreation и создание элементов пользовательского интерфейса в коде не совсем MVVM.
Базовое решение MVVM будет использовать ItemsControl с ItemTemplate, который содержит элемент Image. Свойство ItemsSource ItemsControl привязано к ObservableCollection<ImageSource>
. Элемент Image имеет обработчик событий, который удаляет себя из этой коллекции.
<ItemsControl ItemsSource="{Binding ImageFiles}">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<WrapPanel/>
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemTemplate>
<DataTemplate>
<Image Source="{Binding}"
Height="70" Margin="4"
MouseLeftButtonUp="Image_MouseLeftButtonUp"/>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
...
<Button Content="Load Images..." Click="LoadButton_Click"/>
Класс MainWindow и модель представления будут выглядеть так:
public partial class MainWindow : Window
{
private readonly ViewModel viewModel = new ViewModel();
public MainWindow()
{
DataContext = viewModel;
InitializeComponent();
}
private void LoadButton_Click(object sender, RoutedEventArgs e)
{
var openFileDialog = new OpenFileDialog();
openFileDialog.Multiselect = true;
openFileDialog.Title = "Select Images...";
openFileDialog.Filter = "JPEG Files (*.jpg)|*.jpg|PNG Files (*.png)|*.png";
if (openFileDialog.ShowDialog() == true)
{
viewModel.LoadImages(openFileDialog.FileNames);
}
}
private void Image_MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
{
var image = (Image)sender;
viewModel.ImageFiles.Remove(image.Source);
}
}
public class ViewModel
{
public ObservableCollection<ImageSource> ImageFiles { get; }
= new ObservableCollection<ImageSource>();
public void LoadImages(IEnumerable<string> imageFiles)
{
ImageFiles.Clear();
foreach (var imageFile in imageFiles)
{
var image = new BitmapImage();
image.BeginInit();
image.UriSource = new Uri(imageFile, UriKind.RelativeOrAbsolute);
image.DecodePixelWidth = 100;
image.EndInit();
ImageFiles.Add(image);
}
}
}
Вы можете еще улучшить это, заменив Image обработчиком события мыши на Button, которая использует элемент Image в своем ControlTemplate и имеет свойство Command, связанное со свойством ICommand
в вашей модели представления. Эта команда удалит текущее изображение из исходной коллекции.