代码之家  ›  专栏  ›  技术社区  ›  dnndeveloper

wpf mvvm从视图模型获取父级

  •  21
  • dnndeveloper  · 技术社区  · 15 年前

    在mvvm wpf应用程序中。

    如何从 ViewModel ?

    例子:

    view1 —— viewModel1

    视图模型1 的命令调用:

    var view2 = new view2
    

    view2.Owner =<----这是问题所在。我怎样才能从 viewModel ?

    view2.Show()
    

    编辑:

    请参阅下面接受的答案,然后阅读下面的编辑。

    我正在使用MVVM Light-> http://mvvmlight.codeplex.com/ (顺便说一句,太棒了)

    内置的信息系统很棒。我现在从viewmodel向我的视图发送一条消息,告诉它显示另一个窗口。

    对于消息,我目前正在主视图中使用一个带有switch语句的字符串来确定要打开的视图;不过,我可能会对mvvm light toolkit中的令牌进行修改。

    谢谢您!

    5 回复  |  直到 12 年前
        1
  •  25
  •   LBugnion    15 年前

    在我看来,打开一个新窗口是视图的责任,而不是视图模型的责任。就我个人而言,我将使用与显示对话框相同的方法(这已经在本论坛中讨论过):

    让viewmodel向视图发送一条消息,请求它打开一个新窗口。 (或者)使用idialogservice或任何您想调用它并传递给viewmodel的构造函数的东西。此服务将负责打开窗口(或将此任务委派给视图)。 这样,您就可以保持关注点的清晰分离,并且您的vm仍然是可测试的(您可以单元测试打开新窗口的请求是否已发送,但是您不能测试窗口是否确实已打开)。

    这有道理吗?

    干杯,

    劳伦特

        2
  •  7
  •   Mohammad Zare    14 年前

    从viewmodel调用

    Messenger.Default.Send<NotificationMessage>(new NotificationMessage("Open Window"));
    

    从你的视角来看( 第二种观点 看法 )在构造函数中轻松编写:

    Messenger.Default.Register<NotificationMessage>(this, ReplyToMessage);
    

    并在视图的代码隐藏中编写此方法:

    private void ReplyToMessage(NotificationMessage msg)
    {
       if (msg.Notification == "Open Window")
       {
          SecondWindow win = new SecondWindow();
          win.ShowDialog();
       }
    }
    
        3
  •  1
  •   Community CDub    8 年前

    我没有自己的答案,但这里有一些链接,我最近一直在看,可能会有帮助。我也会对其他人的建议感兴趣。

    据我所知,关键是,你 不应该从视图模型中创建视图 如果可能的话,你需要一种以松散耦合的方式交流你所需要的东西的方式。

    http://www.codeproject.com/KB/WPF/XAMLDialog.aspx

    http://www.codeproject.com/KB/architecture/MVVM_Dialogs.aspx

    Handling Dialogs in WPF with MVVM

        4
  •  0
  •   dove    12 年前

    您可以这样做,就像您需要创建一些事件并在视图中注册这些事件并在视图模型中调用这些事件一样。然后打开弹出窗口。

    就像这个例子

    public class Mainclass : MainView
    {
      public delegate abc RegisterPopUp(abc A);
      public RegisterPopUp POpUpEvent;
    
      public RelayCommand ShowCommand { private set; get; }  
    
      public void ShowCommand() 
      { 
        ShowCommand("Your parameter");
      } 
    }
    

    在视图内

    MainView mn = new MainView();
    

    在这里注册活动 mn.POpUpEvent += 然后双击tab按钮,在寄存器中弹出方法写代码打开弹出窗口。

        5
  •  0
  •   Jitendra    12 年前

    Prism事件聚合器是一种很好的方法,在这种方法中,我们可以创建独立的模块而无需依赖。首先ViewModel将发布事件,然后另一个视图或视图或ViewModel可以从事件聚合器订阅该事件。

    在这种情况下,unity容器还可以使用依赖注入将一个viewmodel注入到另一个viewmodel中。