我在任何地方都找不到。目前,我正在制作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
。关于此主题,我建议您进行以下操作:
关于c# - WPF,MVVM : Creating new View and passing an argument to its ViewModel,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50252041/