为了账号安全,请及时绑定邮箱和手机立即绑定

WPF、MVVM:创建新视图并将参数传递给它的 ViewModel

WPF、MVVM:创建新视图并将参数传递给它的 ViewModel

C#
守候你守候我 2021-06-02 14:55:44
我没有在任何地方找到这个。目前我正在制作一个 WPF 应用程序,但遇到了一个问题。我需要一页,但数据应该不同,具体取决于哪个按钮调用了页面。如果不尝试坚持使用 MVVM,那会很容易。我已经有一个按钮可以将所需的数据传递给页面 cs 文件,但我不知道如何将该数据传递给 ViewModel。详细视图页面.xaml.cs:namespace unnamed{    public partial class DetailedViewPage : BasePage<DetailedViewViewModel>    {            public DetailedViewPage(string position)        {                InitializeComponent();        }    }    //I'm using similar method to create new View    private void CreateNewWindow()    {        var MainWindow = (MainWindow) Application.Current.MainWindow;        var MWViewModel = (WindowViewModel) MainWindow.DataContext;        MWViewModel.CurrentPage = new DetailedViewPage("top");    }}BasePage.cs:public class BasePage<VM> : Page        where VM : BaseViewModel, new()    {        private VM mViewModel;        public VM ViewModel        {            get { return ViewModel; }            set            {                if (mViewModel == value)                    return;                mViewModel = value;                this.DataContext = mViewModel;            }        }        public BasePage()        {            this.Resources = ((MainWindow)Application.Current.MainWindow).Resources;            this.ViewModel = new VM();        }    }详细视图视图模型.cs:namespace unnamed{    public class DetailedViewViewModel : BaseViewModel    {            public string PossitionShown { get; set; }        public DetailedViewViewModel()        {                        }        }}所以我的目标是将位置变量从页面 cs 文件获取到 ViewModel 并分配给PossitionShown.
查看完整描述

1 回答

?
蓝山帝景

TA贡献1843条经验 获得超7个赞

您的视图 ( DetailedViewPage) 有一个DataContext,即DetailedViewViewModel。


DataContext可以通过默认构造函数(在 XAML 中输入时)自动创建,也可以在构造函数中创建。基本上,在创建视图之后,我们可以简单地为其设置值。


public DetailedViewPage(string position)

{

    InitializeComponent();


    //optional line, if not set in XAML

    this.DataContext = new DetailedViewViewModel();


    var VM = (this.DataContext as DetailedViewModel);

    VM.PossitionShown = position;

}

编辑: 添加代码以在 ViewModel 构造中传递变量。


public DetailedViewPage(string position)

{

    InitializeComponent();

    //Note this line is not "optional" anymore, You must pass the value as a variable.

    this.DataContext = new DetailedViewViewModel(position);

}


public class DetailedViewViewModel : BaseViewModel

{

    public string PossitionShown { get; set; }

    public DetailedViewViewModel(string position)

    {

        PossitionShown = position;

    }

}

附带说明一下,这并不完全是MVVM approach,因为您已经通过 传递了一些参数View,并且View正在考虑存在某种类型的ViewModel.


查看完整回答
反对 回复 2021-06-05
  • 1 回答
  • 0 关注
  • 490 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信