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

时间:2015-04-09 09:48:43

标签: 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"); }
       }
    }

我将我的XAML上的数据上下文设置为:

<Window.DataContext>
        <vm:MyViewModel/>
</Window.DataContext>

单击按钮我将我的视图显示为:

Application.Current.Dispatcher.Invoke(() => new MyView(id).Show());

现在,如何将ID从MyView(id)传递到MyViewModel.ID.

3 个答案:

答案 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;
     }
}