我有一个View和ViewModel.
MyView
{
MyView(int id)
{
InitializeComponent();
}
}
MyViewModel
{
private int _id;
public int ID
{
get { return _id; }
set { _id= value; OnPropertyChanged("_id"); }
}
}
Run Code Online (Sandbox Code Playgroud)
我在我的XAML上设置数据上下文:
<Window.DataContext>
<vm:MyViewModel/>
</Window.DataContext>
Run Code Online (Sandbox Code Playgroud)
单击按钮我将我的视图显示为:
Application.Current.Dispatcher.Invoke(() => new MyView(id).Show());
Run Code Online (Sandbox Code Playgroud)
现在,我如何将id传递MyView(id)给MyViewModel.ID.
由于 DataContext 是在 InitializeComponent() 调用之后创建的,因此您可以在之后将其传递给 ViewModel:
MyView
{
MyView(int id)
{
InitializeComponent();
((MyViewModel)DataContext).ID = id;
}
}
Run Code Online (Sandbox Code Playgroud)
您可以执行以下解决方案之一:
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();
}
}
Run Code Online (Sandbox Code Playgroud)
您可以通过注册到 Messenger 使 ViewModel 准备好接收消息。
在视图中执行:
MyView
{
MyView(int id)
{
InitializeComponent();
Messenger.Default.Send<int>(id,"To MyViewModel");
}
}
Run Code Online (Sandbox Code Playgroud)
广播一条消息,通过发送它伴随着“To MyViewModel”标签,这样它就可以被 MyViewModel 捕获。
2)从视图访问数据上下文:
MyView
{
MyView(int id)
{
InitializeComponent();
((MyViewModel)this.DataContext).ID = id;
}
}
Run Code Online (Sandbox Code Playgroud)
第二种解决方案简单明了,我给出了第一种解决方案,以防万一更复杂的情况。
| 归档时间: |
|
| 查看次数: |
14464 次 |
| 最近记录: |