【发布时间】:2013-04-24 17:29:04
【问题描述】:
我在 2 个 ViewModel 之间进行通信时遇到了问题。 在此处下载我的应用以查看问题:http://www76.zippyshare.com/v/26081324/file.html
我有 2 个视图。
带有数据上下文“MainViewModel”的“MainView.xaml”。
带有数据上下文“FirstViewModel”的“FirstView.xaml”。
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”或“Two”的值时,都会调用Calculate()。我现在想要的是,当我单击 MainView 中的按钮时,MainViewModel 必须在 FirstViewModel 中调用 Calculate()。所以我在属性中注释掉了Calculate(),并在我的MainViewModel中实现了一个RelayCommand:
主视图中的按钮
<Button Grid.Row="3" Command="{Binding ChangeValue}" />
主视图模型
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() 时,'One' 和'Two' 的值总是“0”。那么如何在另一个 ViewModel 中调用一个 ViewModel 的方法呢?
编辑:明确一点:我想调用 FirstViewModel() 的方法 'Calculate()' 而不使用 'new FirstViewModel()'!
【问题讨论】:
-
我可能遗漏了一些东西,但我看不出Calculate 方法应该如何改变“One”和“Two”的值。仅更改了“Ergebnis”值。
-
对,在我的第一篇文章中没有提到它。FirstView.xaml 有 2 个文本框。它们每个都绑定到属性,例如
和 'Ergebnis' -> 。您可以下载程序自行查看。就像我说的,当我在 setter 属性中取消注释 'Calculate()' 时,计算工作正常,但我只想在单击另一个视图中的按钮时调用 Calculate()(DataContext 到另一个 ViewModel)。 -
你调试过这个吗?单击按钮时,您是否查看过Calculate() 中发生的情况?通常,如果我需要在 MVVM 应用程序中的视图模型之间进行通信,我将使用所有视图模型都可以用来传递消息的消息传递系统。
-
是的,我调试过了。 “一”和“二”的值为“0”(标准值)。
标签: c# mvvm viewmodel communication