如何将视图构造函数参数传递给视图模型

Sim*_*ons 6 c# wpf mvvm

我有一个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.

Len*_*art 5

由于 DataContext 是在 InitializeComponent() 调用之后创建的,因此您可以在之后将其传递给 ViewModel:

MyView
{
   MyView(int id)
   {
     InitializeComponent();
     ((MyViewModel)DataContext).ID = id;
   }
 }
Run Code Online (Sandbox Code Playgroud)


Aym*_*udi 5

您可以执行以下解决方案之一:

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)

第二种解决方案简单明了,我给出了第一种解决方案,以防万一更复杂的情况。