Передача изображения / данных между несколькими ViewModels в приложении WPF MVVM - PullRequest
0 голосов
/ 17 января 2019

Мне нужна помощь, чтобы понять связь нескольких 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;
    }
}

1 Ответ

0 голосов
/ 17 января 2019

Вы могли бы подумать о том, чтобы сделать вашу ViewModel Singelton

    private static ViewModel _createInstance = null;

    public static ViewModel CreateInstance
    {

        get
        {
            if (null == _createInstance)
            {
                _createInstance = new ViewModel();
            }

            return _createInstance;
        }
    }//END CreateInstance

и получить к нему доступ с помощью функции createInstance:

    ViewModel.CreateInstance.TheImageYouWantToAccess
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...