如何将视图构造函数参数传递给视图模型
How to Pass View Constructor Parameter to View Model
我有一个 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.
由于 DataContext 是在调用 InitializeComponent() 之后创建的,您可以随后将其传递给 ViewModel:
MyView
{
MyView(int id)
{
InitializeComponent();
((MyViewModel)DataContext).ID = id;
}
}
您可以执行以下解决方案之一:
1) 使用 Messenger
模式:
您可以使用 Messenger Pattern,如果您使用的是 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");
}
}
通过发送带有 "To MyViewModel" 标记的消息来广播消息,因此它可以被 MyViewModel 捕获。
2) 从视图访问 DataContext:
MyView
{
MyView(int id)
{
InitializeComponent();
((MyViewModel)this.DataContext).ID = id;
}
}
第二种方案简单明了,我给出第一种方案只是为了应对更复杂的场景。
首先,
OnPropertyChanged("_id") 是错误的,因为 _id 是一个变量,而不是 属性。您必须更改为 OnPropertyChanged("ID")。您可以在代码后面分配 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;
}
}
我有一个 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.
由于 DataContext 是在调用 InitializeComponent() 之后创建的,您可以随后将其传递给 ViewModel:
MyView
{
MyView(int id)
{
InitializeComponent();
((MyViewModel)DataContext).ID = id;
}
}
您可以执行以下解决方案之一:
1) 使用 Messenger
模式:
您可以使用 Messenger Pattern,如果您使用的是 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");
}
}
通过发送带有 "To MyViewModel" 标记的消息来广播消息,因此它可以被 MyViewModel 捕获。
2) 从视图访问 DataContext:
MyView
{
MyView(int id)
{
InitializeComponent();
((MyViewModel)this.DataContext).ID = id;
}
}
第二种方案简单明了,我给出第一种方案只是为了应对更复杂的场景。
首先, OnPropertyChanged("_id") 是错误的,因为 _id 是一个变量,而不是 属性。您必须更改为 OnPropertyChanged("ID")。您可以在代码后面分配 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;
}
}