【问题标题】:Silverlight MVVM moving the results from Child Window ViewModel to Parent Window ViewModelSilverlight MVVM 将结果从子窗口 ViewModel 移动到父窗口 ViewModel
【发布时间】:2012-02-24 14:33:05
【问题描述】:

您好,我有一个使用 MVVM 灯的 silverlight MVVM 应用程序。 当我打开应用程序时,应弹出一个子窗口,并在子窗口中指定条件并单击“确定”按钮后,主窗口应显示详细信息。

 public MainPage()
    {
        ChildPage cp = new ChildPage();
        cp.Show();
        InitializeComponent();
    }

点击子窗口上的“确定”按钮后,该窗口应消失并在主窗口上显示对象列表。在子窗口的视图模型中,我有一个 RelayCommand OKCommand。

 private void WireCommands()
    {
        OKCommand = new RelayCommand(GetEmployees);
    }

    private void GetEmployees()
    {
        IEnumerable<Employees> employees;
                       employees = from employee in Employees where employee.Name == selectedEmployee.Name select employee;

        Employees= new ObservableCollection<Employee>(employees);
    }

员工具有所需的结果。但我不知道如何关闭 chils 窗口并将结果移动到父窗口。提前致谢。

【问题讨论】:

    标签: silverlight mvvm-light


    【解决方案1】:

    您可以使用(按解耦的递增顺序):

    1. 由于您在 MainPage 中引用了 ChildPage,因此您可以访问其属性。
    2. 使用standard .NET events,事件在子页面,订阅在MainPage中完成
    3. 使用event aggregator 模式。多个MVVM frameworks 实现了事件聚合器模式。

    使用 .NET 事件

    ChildPage cp = new ChildPage();
    cp.NameReceived += NameReceived;
    cp.Show();
    
    private void NameRecieved(object sender, NameReceivedEventArgs eventArgs)
    {
      // retrieve employees using eventargs.Name
    }
    

    使用 Caliburn.Micro 的事件聚合器

    public class MainPage : Screen, IHandle<NameReceivedMessage>
    {
      public MainPage(IEventAggregator eventAggregator)
      {
        eventAggregator.Subscribe(this);
      }
    
      public void Handle(NameReceivedMessage message)
      {
        // retrieve employees using message.Name which is the inputted name
      }
    }
    

    在从 ChildPage 接收名称后,我们在 MainPage 中进行员工检索。或者,您可以在 ChildPage 中检索员工,并将它们传递到事件 args/message 中。

    【讨论】:

    • 能否请您在 (2) 和 (3) 中更详细一点。因为我是 MVVM 框架的新手。如果你能提供一些例子那就太好了。
    • 我已经用 MainPage 的一些示例(在这种情况下为订阅者)更新了答案。如果您需要发布者的外观示例(ChildPage),请告诉我,但它相当简单。 MainPage 订阅 ChildPage 发布的事件。
    • 使用我只能访问视图而不是员工集合所在的 ViewModel 的事件
    • 啊,我刚刚重读了这个问题,我认为 MainPage 和 ChildPage 是视图模型。如果你使用 MVVM,你应该最小化代码后面。我会推荐一种视图模型优先的方法,其中视图模型负责定位视图并显示它们。这是内置在前面链接的 MVVM 框架中的。
    • 非常感谢。你能给我看看这种方法的教程吗?
    【解决方案2】:

    要关闭子窗口,您可以使用 ChildWindow 的 Close() 方法,也可以将 DialogResult 属性设置为 true 或 false 来关闭它。 您必须在 OK 按钮的 OnClick 事件的 ChildPage 的代码隐藏中执行此操作。

    要访问 ChildPage 的 ViewModel 的 Employees 属性,您可以执行以下操作:

    public MainPage()
    {
        ChildPage cp = new ChildPage();
        cp.Closed += (s,e) =>
        {
          //Do something with (cp.DataContext as ChildPageViewModel).Employees
        }
        cp.Show();
        InitializeComponent();
    }
    

    【讨论】:

    • 我目前使用DialogResult属性来关闭窗口。但是当我分配 Observable d = (cp.DataContext as ChildPageViewModel).Employees 它抱怨 cp.Datacontext 为空。
    猜你喜欢
    • 2019-11-25
    • 1970-01-01
    • 2017-09-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-17
    • 1970-01-01
    • 2016-05-04
    相关资源
    最近更新 更多