Мне нужна помощь, чтобы понять связь нескольких ViewModel в Wpf.
(1): у меня есть MainWindowViewModel, который загружает изображение и отображает в MainWindow.
(2): у меня есть кнопка ChildWindowViewModel, содержащая кнопку для преобразования изображения в grayimage
Мне нужно передать входное изображение из mainviewmodel в childviewmodel, чтобы применить серую операцию, когда событие запускается в childwindow, а после применения операции я должен вернуть измененное изображение в mainviewmodel для отображения в mainwindow
Я попытался сделать что-то кодовое, передав главное окно в childviewmodel, и это сработало,
Теперь я должен достичь этого с чистой архитектурой mvvm
Дайте мне предложение, заранее спасибо:)
MainWindow:
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="30"/>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<Grid Grid.Row="0" >
<StackPanel Orientation="Horizontal">
<Button Content="Load Image" Command="{Binding OpenImg}"/>
<Button Content="Child Window" Command="{Binding ChildWin}"/>
</StackPanel>
</Grid>
<Grid Grid.Row="1" >
<Viewbox Margin="5,5,5,5">
<Image x:Name="image" Source="{Binding Image}"/>
</Viewbox>
</Grid>
</Grid>
MainWindowViewModel:
public class MainWindowViewModel : ViewModelBase
{
public ICommand OpenImg { get; set; }
Bitmap bitmap;
public MainWindowViewModel()
{
OpenImg = new RelayCommand(LoadImage);
}
private BitmapImage _image;
public BitmapImage Image
{
get { return _image; }
set
{
_image = value;
RaisePropertyChanged("Image");
}
}
private void LoadImage()
{
OpenFileDialog op = new OpenFileDialog();
op.Title = "Select a Picture";
op.Filter = "Images (*.BMP;*.JPG;*.GIF;*.PNG;*.TIFF)|*.BMP;*.JPG;*.GIF;*.PNG;*.TIFF|" +
"All files (*.*)|*.*";
op.Multiselect = true;
if (op.ShowDialog() == true)
{
Image = new BitmapImage(new Uri(op.FileName));
bitmap = new Bitmap(op.FileName);
}
}
private RelayCommand _childWin;
public ICommand ChildWin
{
get
{`enter code here`
if (_childWin == null)
{
_childWin = new RelayCommand(DisplayChildWin);
}
return _childWin;
}
}
private void DisplayChildWin()
{
ChildWindow childWindow = new ChildWindow();
childWindow.ShowDialog();
}
}
ChildWindow:
<Grid>
<Button Content="Convert To GrayImage" Command="{Binding ApplyGray}" Width="150" Height="30" />
</Grid>
ChildWindowViewModel:
public class ChildWindowViewModel : ViewModelBase
{
public ChildWindowViewModel()
{
}
private RelayCommand _applyGray;
public ICommand ApplyGray
{
get
{
if (_applyGray == null)
{
_applyGray = new RelayCommand(ApplyGrayScale);
}
return _applyGray;
}
}
private void ApplyGrayScale()
{
}
}
Класс GrayConversion:
public static class GrayScale
{
public static Bitmap ApplyGray(Bitmap bmp)
{
//get image dimension
int width = bmp.Width;
int height = bmp.Height;
//color of pixel
Color p;
//grayscale
for (int y = 0; y < height; y++)
{
for (int x = 0; x < width; x++)
{
//get pixel value
p = bmp.GetPixel(x, y);
//extract pixel component ARGB
int a = p.A;
int r = p.R;
int g = p.G;
int b = p.B;
//find average
int avg = (r + g + b) / 3;
//set new pixel value
bmp.SetPixel(x, y, Color.FromArgb(a, avg, avg, avg));
}
}
return bmp;
}
}