【问题标题】:WPF, MVVM: Creating new View and passing an argument to its ViewModelWPF,MVVM:创建新视图并将参数传递给其 ViewModel
【发布时间】:2018-05-09 11:15:23
【问题描述】:

我在任何地方都没有找到这个。目前我正在制作一个 WPF 应用程序,但遇到了问题。我需要一页,但数据应该不同,具体取决于调用页面的按钮。如果不尝试坚持使用 MVVM,那会很容易。我已经有一个将所需数据传递给页面 cs 文件的按钮,但我不知道如何将这些数据传递给 ViewModel。

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

DetailedViewViewModel.cs:

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

        public DetailedViewViewModel()
        {                
        }    
    }
}

所以我的目标是从页面 cs 文件中获取位置变量到 ViewModel 并分配给PossitionShown

【问题讨论】:

  • 您如何创建新页面?请提供代码。
  • 基本上就是这样一行代码((WindowViewModel)((MainWindow)Application.Current.MainWindow).DataContext).CurrentPage = new DetailedViewPage("top");

标签: c# wpf mvvm


【解决方案1】:

您的视图 (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

关于这个话题,我推荐阅读:

【讨论】:

  • 有趣。我尝试了非常相似的方法,但它没有用,而你的工作我会深入研究。但我还不完全满意。我在启动DetailedViewViewModel时没有那个变量,程序只在DetailedViewViewModelis完成创建后设置值,但我需要构造函数中的值。
  • 我在尝试创建视图模型时遇到错误'DetailedViewViewModel' must be a non-abstract type with a public parameterless constructor in order to use it as parameter 'VM' in the generic type or method 'BasePage&lt;VM&gt;' 我认为我应该更改 BasePage 类中的某些内容,但不确定是什么。
  • 好吧,它明确指出DetailedViewViewModel 必须有无参数构造函数,因为它在需要的地方(可能在 XAML 中)被引用。
  • 终于成功了!!!非常感谢您的帮助,虽然这很简单,但确实很有帮助:)
猜你喜欢
  • 2013-10-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多