Silverlight MVVM将结果从子窗口ViewModel移动到父窗口ViewModel

时间:2012-02-24 14:33:06

标签: silverlight mvvm-light

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

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

点击子窗口上的OK按钮后,该窗口将消失,并在主窗口上显示对象列表。在子窗口的视图模型中,我有一个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窗口并将结果移动到父窗口。提前谢谢。

2 个答案:

答案 0 :(得分:1)

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

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

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

    使用Caliburn.Micro中的Event Aggregator

    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中传递它们。

答案 1 :(得分:0)

要关闭子窗口,您可以使用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();
}