3

我在 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 的方法呢?

编辑:为了清楚起见:我想在不使用“new FirstViewModel()”的情况下调用 FirstViewModel() 的“Calculate()”方法!

4

1 回答 1

2

我无法查看您的项目,因为它需要 Windows 8,但您确定FirstViewModel您所拥有的与DataContext您在 中所指FirstView的相同吗?从我所看到的,你在which的构造函数中更新了 a是私有的。FirstViewModelMainViewModelFirstViewModelMainViewModel

于 2013-04-24T22:20:43.150 回答