【问题标题】:How to Pass View Constructor Parameter to View Model如何将视图构造函数参数传递给视图模型
【发布时间】:2015-04-09 09:48:42
【问题描述】:

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

【问题讨论】:

  • 在代码而不是 XAML 中设置 DataContext:DataContext = new MyViewModel { ID = id };
  • 但我想尽可能减少代码背后的使用。
  • 那不是 MVVM。这就是货物崇拜。 Codebehind 非常适合 UI 问题。它不应该用于BI。 (刚刚注意到——你好!不是拖钓你的 q,我只是浏览我的 MVVM RSS 提要)

标签: c# wpf mvvm


【解决方案1】:

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

MyView
{
   MyView(int id)
   {
     InitializeComponent();
     ((MyViewModel)DataContext).ID = id;
   }
 }

【讨论】:

    【解决方案2】:

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

    1) 使用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");
      }
    }
    

    广播一条消息,通过发送它伴随着“To MyViewModel”标签,这样它就可以被MyViewModel捕获。

    2) 从视图访问 DataContext :

    MyView
    {
      MyView(int id)
      {
        InitializeComponent();
        ((MyViewModel)this.DataContext).ID = id;
      }
    }
    

    第二个解决方案简单明了,我给出第一个解决方案只是为了以防更复杂的场景。

    【讨论】:

      【解决方案3】:

      首先, 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;
           }
      }
      

      【讨论】:

        猜你喜欢
        • 2011-02-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-12-09
        • 1970-01-01
        相关资源
        最近更新 更多