c# - WPF,MVVM : Creating new View and passing an argument to its ViewModel

标签 c# wpf mvvm

我在任何地方都找不到。目前,我正在制作WPF应用程序,但遇到了问题。我需要一页,但数据应该根据召唤该页面的按钮而有所不同。如果不尝试使用MVVM,这将很容易。我已经有一个按钮,可以将所需的数据传递到页面cs文件,但是我不知道如何将这些数据传递到ViewModel。

DetailsViewPage.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();
        }
    }

DetailsViewViewModel.cs:
namespace unnamed
{
    public class DetailedViewViewModel : BaseViewModel
    {    
        public string PossitionShown { get; set; }

        public DetailedViewViewModel()
        {                
        }    
    }
}

因此,我的目标是将位置变量从页面cs文件获取到ViewModel并分配给PossitionShown

最佳答案

您的 View (DetailedViewPage)有一个DataContext,即DetailedViewViewModel
DataContext可以通过默认构造函数自动创建(在XAML中输入),也可以在构造函数中创建。基本上,创建 View 后,我们可以简单地为其设置值。

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

关于此主题,我建议您进行以下操作:
  • Opening new window in MVVM WPF
  • Wpf datacontext binding using MVVM between viewmodel and view
  • 关于c# - WPF,MVVM : Creating new View and passing an argument to its ViewModel,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50252041/

    相关文章:

    c# - 按自定义顺序对列表进行排序

    c# - 使用 LINQ 修剪 List<string[]> 中所有字符串的最简单方法?

    c# - XAML Treeview,如何水平而不是垂直显示节点

    wpf - 如何释放Image.Source来更新WPF中的图像?

    c# - DataGrid ComboBox 第一次点击时没有选中项

    c# - CSV 读数为空

    c# - 为什么在 MySQL 的存储过程中使用 OUT 参数时 ODBC C# 返回空字符串?

    c# - 驱动 MVVM 应用程序

    wpf - 使用数据模板将 View 与 View 模型相关联时,如何动画化从一个 View 到另一个 View 的过渡

    wpf - Prism (CAL) 中的模块如何相互通信?