我已在 MainWindow 中加载图像,现在我尝试在调用 ChildWindow 时在 ChildWindow 中显示输入图像,但无法将输入图像获取到 ChildWindow。
如何将MainWindowViewModel中加载的输入图像传递给ChildWindowViewModel
我必须遵循什么方法来加载输入图像并将其传递给多个 View 模型
这是我的代码
主窗口 View 模型
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();
}
}
子窗口 View 模型
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");
}
}
}
}
最佳答案
有很多方法可以处理这个问题,但需要进行各种权衡。为了使事情简单并使用您提供的内容,我将执行以下操作。
我假设在您的 ChildWindow
类中,您将 DataContext
设置为 new ChildWindowViewModel();
或以其他方式创建一个 StaticResource
在您的 XAML 中。此解决方案需要您将其删除。
只需在 ChildWindowViewModel
的构造函数中要求 BitmapImage
并从中删除 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();
}
我会尝试从 MainWindowViewModel
类中完全删除 ChildWindow
的创建。这是最好由工厂处理的事情,可以将其注入(inject)到 MainWindowViewModel 中。 Adaptive Code via C#是一本很棒的书,很好地涵盖了依赖倒置、SOLID 和一些简单的抽象。
关于c# - 如何在 ViewModel WPF、MVVM 之间传递数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52383282/