【问题标题】:Call method of a ViewModel from MainViewModel从 MainViewModel 调用 ViewModel 的方法
【发布时间】: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


【解决方案1】:

我无法查看您的项目,因为它需要 Windows 8,但您确定您拥有的 FirstViewModel 与您的 FirstView 中的 DataContext 与您在 @987654325 中所指的 FirstViewModel 相同@?据我所知,您在 MainViewModel 的构造函数中新建了一个 FirstViewModel,它是私有的。

【讨论】:

  • 是的,没错...我正在 MainViewModel 的构造函数中新建一个 FirstViewModel。由于我不知道如何在 FirstViewModel 中调用方法“Calculate()”,所以我正在这样做......在不创建 FirstViewModelß 的新实例的情况下调用方法“Calculate89”的任何其他方式跨度>
  • 是的,您应该在 MainViewModel 中公开引用您的 FirstViewModel。然后,您的主窗口的 DataContext 将是 MainViewModel,而 ContentControl 的 DataContext 将是对您在 MainViewModel 中的同一个 FirstViewModel 实例的引用。
  • K,明白了!它现在正在工作。就像你说的,我只需要在 MainViewModel 的构造函数中为 FirstViewModel 创建一个变量(即 fvm = new FirstViewModel)。然后说 MyContent.DataContext = fvm;现在我可以调用 fvm.Calculate();并且值不会是 0。
猜你喜欢
  • 2021-01-19
  • 1970-01-01
  • 1970-01-01
  • 2010-11-06
  • 2021-11-18
  • 2021-03-14
  • 1970-01-01
  • 2013-11-12
  • 1970-01-01
相关资源
最近更新 更多