c# - 如何在 ViewModel WPF、MVVM 之间传递数据

标签 c# wpf mvvm

我已在 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/

相关文章:

c#:在运行时创建新设置

c# - 通知中心传递失败 C#

javascript - 在 vuejs 中是否有重置组件初始数据的正确方法?

c# - 如何将列表列表绑定(bind)到 View ?

wpf - LIstView键盘导航,例如WPF中的Windows资源管理器

c# - 将函数绑定(bind)到 xaml 中的 MouseDown 事件?

c# - 如何通过属性包装方法?

c# - 使用相同 NuGet 包的两个不同版本

WPF GridSplitter 拆分/调整两个 ListBox 的大小?

.net - WPF 或 Windows 窗体