我有一个视图和视图模型。
MyView
{
MyView(int id)
{
InitializeComponent();
}
}
MyViewModel
{
private int _id;
public int ID
{
get { return _id; }
set { _id= value; OnPropertyChanged("_id"); }
}
}
字符串
我将XAML上的数据上下文设置为:
<Window.DataContext>
<vm:MyViewModel/>
</Window.DataContext>
型
单击按钮时,我显示的视图为:
Application.Current.Dispatcher.Invoke(() => new MyView(id).Show());
型
现在,如何将id从MyView(id)
传递到MyViewModel.ID.
4条答案
按热度按时间3pmvbmvn1#
由于DataContext是在InitializeComponent()调用之后创建的,因此您可以在之后将其传递给ViewModel:
字符串
gywdnpxw2#
您可以执行以下解决方案之一:
1)使用
Messenger
模式:您可以使用Messenger模式,例如,如果您使用
MVVMLight
,您可以执行以下操作:在
ViewModel
中:字符串
通过注册到Messenger,可以使ViewModel准备好接收消息。
在视图中执行以下操作:
型
广播一条消息,发送消息时附带“To MyViewModel”标签,这样MyViewModel就可以捕获它。
2)从View访问DataContext:
型
第二个解决方案简单明了,我给出的第一个只是为了更复杂的情况。
0x6upsns3#
首先,OnPropertyChanged(“_id”)是错误的,因为_id是变量,而不是属性。您必须更改为OnPropertyChanged(“ID”)。您可以在代码隐藏中指定viewModel。
字符串
ruoxqz4g4#
正如Doctor所说,将variable传递给viewmodel是正确的方法,而将viewmodels参数赋值是错误的:让我评论以下几点:
我认为这两种方式都是错误的。
第一个原因是视图模型在大多数情况下也被用作视图(XAML)页面的绑定/数据上下文。它必须有一个没有构造函数属性/输入变量的datacontext,即使在设置默认值时也是如此:public int maximum(int n)InputVar = null){}
第二个原因是,给其他视图模型类中的参数赋值会让它变得可怕,因为这些变量一旦被设置,当视图模型中发生其他事情时,即使没有重新分配或处理该参数,这些变量也会变成default/ null或空。这是我的项目经常遇到的问题,我想以简单的方式将数据发送到其他视图模型,但总是遇到问题。我建议使用EventAggregators:举个例子:
字符串
然后在Viewmodel A中:
型
在Viewmodel B中:
型