У меня возникли проблемы с сообщением между 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()'!
Возможно, мне что-то не хватает, но я не вижу, как метод Calculate должен изменять значения «Один» и «Два». Изменяется только значение «Ergebnis». – Kimko
Правильно, не упоминал об этом в моем первом сообщении .. У FirstView.xaml есть 2 текстовых поля. Каждый из них привязывается к свойству, например и 'Ergebnis' -> . Вы можете скачать программу, чтобы увидеть ее самостоятельно. Как я уже сказал, Calculation отлично работает, когда я раскомментирую «Calculate()» в свойстве setter, но я хочу вызвать Calculate() только тогда, когда я нажимаю кнопку в другом представлении (с DataContext для другого ViewModel). –
Rudi
Вы отлаживали это? Вы посмотрели, что происходит в Calculate(), когда нажата кнопка? Обычно, если мне нужно общаться между моделями просмотра в приложении MVVM, я буду использовать систему обмена сообщениями, которую все модели просмотра могут использовать для передачи сообщений. – Chris