Silverlight MVVM перемещает результаты из дочернего окна ViewModel в родительское окно ViewModel - PullRequest
0 голосов
/ 24 февраля 2012

Привет, у меня есть приложение silverlight MVVM, использующее MVVM light. Когда я открываю приложение, должно появиться дочернее окно, и после указания условия в дочернем окне и нажатия кнопки ОК главное окно должно отображать детали.

 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 и переместить результат в родительское окно. Заранее спасибо.

Ответы [ 2 ]

1 голос
/ 24 февраля 2012

Вы можете использовать (в порядке возрастания развязки):

  1. Поскольку у вас есть ссылка на ChildPage в MainPage, вы можете получить доступ к его свойствам.
  2. Использовать стандартные события .NET , где событие находится на дочерней странице, а подписка выполняется в MainPage
  3. . Используйте агрегатор событий .Несколько сред MVVM реализуют шаблон агрегатора событий.

Использование событий .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
  }
}

Здесь мы выполняем поиск сотрудников в MainPage после получения имени из ChildPage.Кроме того, вы можете получить сотрудников в ChildPage и передать их в аргумент / сообщение о событии.

0 голосов
/ 24 февраля 2012

Чтобы закрыть дочернее окно, вы можете использовать метод Close () объекта ChildWindow или установить для свойства DialogResult значение true или false, которые также закрывают его. Это необходимо сделать в выделенном коде ChildPage для события OnClick кнопки OK.

Чтобы получить доступ к свойству Employees ViewModel ChildPage, вы можете сделать что-то вроде этого:

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