Как передать данные между ViewModels WPF, MVVM - PullRequest
0 голосов
/ 18 сентября 2018

Я загрузил изображение в MainWindow, теперь я пытаюсь отобразить входное изображение в ChildWindow, когда оно вызывается, но не удается получить входное изображение в ChildWindow.

Как передать входное изображение, загруженное в MainWindowViewModel, в ChildWindowViewModel

Какой метод я должен использовать, чтобы загрузить входное изображение и передать его нескольким моделям представления

Вот мой код

MainWindowViewModel

public class MainWindowViewModel : ViewModelBase
{
    public ICommand OpenImg { get; set; }

    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));
        }
    }       

    private RelayCommand _childWin;
    public ICommand ChildWin
    {
        get
        {
            if (_childWin == null)
            {
                _childWin = new RelayCommand(DisplayChildWin);
            }
            return _childWin;
        }
    }

    private void DisplayChildWin()
    {
        ChildWindow childWindow = new ChildWindow();
        childWindow.Show();
    }
}

ChildWindowViewModel

public class ChildWindowViewModel : ViewModelBase
{
    public ChildWindowViewModel()
    {
        MainWindowViewModel = new MainWindowViewModel();

        Imge = MainWindowViewModel.Image;
    }

    private BitmapImage _imge;
    public BitmapImage Imge
    {
        get { return _imge; }
        set
        {
            _imge = value;
            RaisePropertyChanged("Imge");
        }
    }

    private MainWindowViewModel _mainWindowViewModel;
    public MainWindowViewModel MainWindowViewModel
    {
        get
        {
            return _mainWindowViewModel;
        }
        set
        {
            if (value != _mainWindowViewModel)
            {
                _mainWindowViewModel = value;
                RaisePropertyChanged("MainWindowViewModel");
            }
        }
    }
}

1 Ответ

0 голосов
/ 18 сентября 2018

Есть много способов справиться с этим, с различными компромиссами. Для простоты и работы с тем, что вы предоставили, я бы сделал следующее:

Я предполагаю, что в вашем ChildWindow классе вы устанавливаете DataContext на new ChildWindowViewModel(); или иным образом создаете StaticResource в своем XAML. Это решение потребует от вас удалить это.

Просто потребуйте BitmapImage в конструкторе ChildWindowViewModel и удалите из него знание MainWindowViewModel.

public class ChildWindowViewModel : ViewModelBase
{
    public ChildWindowViewModel(BitmapImage image)
    {
        _imge = image;
    }

    private BitmapImage _imge;
    public BitmapImage Imge
    {
        get { return _imge; }
        set
        {
            _imge = value;
            RaisePropertyChanged("Imge");
        }
    }
}

Теперь в вашем MainWindowViewModel вы можете обновить метод DisplayChildWin следующим образом:

private void DisplayChildWin()
{
    var childWindow = new ChildWindow();
    var childWindowViewModel = new ChildWindowViewModel(Imge);
    childWindow.DataContext = childWindowViewModel;
    childWindow.Show();
}

Я бы попытался удалить творение ChildWindow полностью из вашего MainWindowViewModel класса. Это то, что лучше всего обрабатывается фабрикой, которая может быть введена в MainWindowViewModel. Адаптивный код через C # - отличная книга, в которой подробно рассматриваются вопросы инверсии зависимости, SOLID и некоторые простые абстракции.

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