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

我没有在任何地方找到这个。目前我正在制作一个 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.


守候你守候我
浏览 491回答 1
1回答

蓝山帝景

您的视图 ( DetailedViewPage) 有一个DataContext,即DetailedViewViewModel。DataContext可以通过默认构造函数(在 XAML 中输入时)自动创建,也可以在构造函数中创建。基本上,在创建视图之后,我们可以简单地为其设置值。public DetailedViewPage(string position){&nbsp; &nbsp; InitializeComponent();&nbsp; &nbsp; //optional line, if not set in XAML&nbsp; &nbsp; this.DataContext = new DetailedViewViewModel();&nbsp; &nbsp; var VM = (this.DataContext as DetailedViewModel);&nbsp; &nbsp; VM.PossitionShown = position;}编辑: 添加代码以在 ViewModel 构造中传递变量。public DetailedViewPage(string position){&nbsp; &nbsp; InitializeComponent();&nbsp; &nbsp; //Note this line is not "optional" anymore, You must pass the value as a variable.&nbsp; &nbsp; this.DataContext = new DetailedViewViewModel(position);}public class DetailedViewViewModel : BaseViewModel{&nbsp; &nbsp; public string PossitionShown { get; set; }&nbsp; &nbsp; public DetailedViewViewModel(string position)&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; PossitionShown = position;&nbsp; &nbsp; }}附带说明一下,这并不完全是MVVM approach,因为您已经通过 传递了一些参数View,并且View正在考虑存在某种类型的ViewModel.
打开App,查看更多内容
随时随地看视频慕课网APP