2013-04-24 3 views
3

У меня возникли проблемы с сообщением между 2 ViewModels. Загрузите мое приложение здесь, чтобы увидеть проблему: http://www76.zippyshare.com/v/26081324/file.htmlВызов метода ViewModel из MainViewModel

У меня 2 просмотра.

  • A 'MainView.xaml' с datacontext 'MainViewModel'.

  • A 'FirstView.xaml' с datacontext 'FirstViewModel'.

В MainView имеется ContentControl с Content = FirstView. Мой FirstViewModel смотрел что-то вроде этого:

public class FirstViewModel : ViewModelBase 
{ 

    public FirstViewModel() 
     { 
     One = "0"; 
     Two = "0"; 
     Ergebnis = 0; 
    } 
    private string _one; 
    public string One 
    { 
     get { return _one; } 
     set 
     { 
      if (value != null) 
      { 
        _one = value; 
        Calculate(); 
        RaisePropertyChanged(() => One); 
      } 
     } 
    } 

    private string _two; 
    public string Two 
    { 
     get { return _two; } 
     set 
     { 
        _two = value; 
        Calculate(); 
        RaisePropertyChanged(() => Two9; 
     } 

    } 

    private decimal _ergebnis; 
    public decimal Ergebnis 
    { 
     get { return _ergebnis; } 
     set 
     { 
      if (value != null) 
      { 
       if (value != _ergebnis) 
       { 
        _ergebnis = value; 
        RaisePropertyChanged(() => Ergebnis); 
       } 
      } 


     } 
    } 

    public void Calculate() 
    { 
     if (Two != null) 
     { 
      for (int i = 0; i < 500; i++) 
      { 
       Ergebnis = i; 
      } 
      Ergebnis = (decimal.Parse(One) + decimal.Parse(Two)); 
     } 
    } 

Как вы можете видеть, каждый раз, когда значение свойства «One» или «два», изменяется, он будет вызывать Calculate(). Теперь я хочу, чтобы при щелчке по кнопке в MainView MainViewModel вызывал Calculate() в FirstViewModel. Поэтому я закомментировал Calculate() в propertys и реализовали RelayCommand в моем MainViewModel:

Кнопка в MainView

<Button Grid.Row="3" Command="{Binding ChangeValue}" /> 

MainViewModel

public MainViewModel 
{ 
    ChangeValue = new RelayCommand(ChangeValueCommandExecute); 
} 

public RelayCommand ChangeValue { get; private set; } 
private FirstViewModel fwm; 

private void ChangeValueCommandExecute() 
{ 
    //CurrentView = Content of the ContentControl in the MainView, which is FirstView 
    if (CurrentView.Content.ToString().Contains("FirstView")) 
    { 
     fwm.Calculate(); 
    } 
} 

Это означает, что при нажатии на кнопку, Вызывается ChangeValueCommandExecute(). Команда вызовет fwm.Calculate() и установит новую сумму (= Ergebnis). Проблема в том, что когда вызывается Calculate(), значение «Один» и «Два» всегда «0». Итак, как я могу назвать метод ViewModel в другой ViewModel?

Редактировать: Чтобы сделать это ясно: я хочу вызвать метод 'Calculate()' FirstViewModel(), не используя 'new FirstModel()'!

+0

Возможно, мне что-то не хватает, но я не вижу, как метод Calculate должен изменять значения «Один» и «Два». Изменяется только значение «Ergebnis». – Kimko

+0

Правильно, не упоминал об этом в моем первом сообщении .. У FirstView.xaml есть 2 текстовых поля. Каждый из них привязывается к свойству, например и 'Ergebnis' ->. Вы можете скачать программу, чтобы увидеть ее самостоятельно. Как я уже сказал, Calculation отлично работает, когда я раскомментирую «Calculate()» в свойстве setter, но я хочу вызвать Calculate() только тогда, когда я нажимаю кнопку в другом представлении (с DataContext для другого ViewModel). – Rudi

+0

Вы отлаживали это? Вы посмотрели, что происходит в Calculate(), когда нажата кнопка? Обычно, если мне нужно общаться между моделями просмотра в приложении MVVM, я буду использовать систему обмена сообщениями, которую все модели просмотра могут использовать для передачи сообщений. – Chris

ответ

2

Я не могу просмотреть свой проект, поскольку он требует Windows 8, но вы уверены, что у вас есть FirstViewModel как DataContext вашей FirstView тот же FirstViewModel вы имеете в виду в вашем MainViewModel? Из того, что я вижу, вы создаете FirstViewModel в конструкторе MainViewModel, который является приватным.

+0

Да, это правильно ... Я новичок в FirstViewModel в моем конструкторе MainViewModel. Поскольку я не знаю, как еще назвать метод «Calculate()» в FirstViewModel, я делаю это так ...Любой другой способ вызвать метод «Calculate89» без создания нового экземпляра FirstViewModelß – Rudi

+1

Да, у вас должна быть общедоступная ссылка на ваш FirstViewModel в MainViewModel. Тогда DataContext вашего основного окна будет MainViewModel, а DataContext ContentControl будет ссылкой на тот же экземпляр FirstViewModel, который у вас есть в вашем MainViewModel. – ChrisO

+1

К, понял! Теперь работает. Как вы сказали, мне просто нужно создать переменную в конструкторе MainViewModel для FirstViewModel (i.E. fvm = new FirstViewModel). Затем скажите MyContent.DataContext = fvm; Теперь я могу вызвать fvm.Calculate(); и значения не будут равны 0. – Rudi

Смежные вопросы