我有一个View和ViewModel。
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.
答案 0 :(得分:4)
由于DataContext是在InitializeComponent()调用之后创建的,因此您可以在之后将其传递给ViewModel:
MyView
{
MyView(int id)
{
InitializeComponent();
((MyViewModel)DataContext).ID = id;
}
}
答案 1 :(得分:4)
您可以执行以下解决方案之一:
1)使用Messenger
模式:
您可以使用Messenger模式,例如,如果您使用MVVMLight
,则可以执行以下操作:
在ViewModel
执行:
MyViewModel
{
private int _id;
public int ID
{
get { return _id; }
set { _id= value; OnPropertyChanged("_id"); }
}
Public void InitilizeMessenger()
{
Messenger.Default.Register(this,"To MyViewModel", (int id) => ID = id);
}
public MyViewModel()
{
InitilizeMessenger();
}
}
通过注册Messenger,使ViewModel准备好接收消息。
视图中的执行:
MyView
{
MyView(int id)
{
InitializeComponent();
Messenger.Default.Send<int>(id,"To MyViewModel");
}
}
通过发送消息来广播消息,并通过&#34; To MyViewModel&#34;标记,因此它可以被MyViewModel捕获。
2)从视图中访问DataContext:
MyView
{
MyView(int id)
{
InitializeComponent();
((MyViewModel)this.DataContext).ID = id;
}
}
第二个解决方案简单明了,我给出了第一个解决方案,仅用于更复杂的场景。
答案 2 :(得分:1)
首先, OnPropertyChanged(&#34; _id&#34;)是错误的,因为_id是变量,而不是属性。您必须更改为OnPropertyChanged(&#34; ID&#34;)。您可以在后面的代码中分配viewModel。
class MyView
{
MyView(int id)
:this(new MyViewModel(id))
{
}
MyView(MyViewModel viewModel)
{
InitializeComponent();
this.DataContext = viewModel;
}
}
class MyViewModel
{
private int _id;
public int ID
{
get { return _id; }
set { _id= value; OnPropertyChanged("ID"); }
}
public MyViewModel(int id)
{
ID=id;
}
}