wpf中的ViewModel层次结构

时间:2016-12-19 00:31:13

标签: c# wpf mvvm datacontext

我有一个UI结构,它由MainWindowViewModel和MainViewModel组成,它有三个选项卡ViewModels。我正在使用MVVMLight来实例化那些选项卡。我需要将一个字符串从firstviewmodel传递给xaml,以便在我的主窗口视图中显示它。当我不使用MainWindowViewModel它工作,但我的MainViewModel是MainWindowViewModel的一部分。所以,我的问题 - 在MainWindowViewModel中初始化MainViewModel的正确方法是什么,这样我就可以从我的选项卡中获取Text Property并将其显示在我的窗口中?

我的MainWindow.xaml

   public partial class MainWindow : Window
         {
            public MainWindow()
            {
                InitializeComponent();
                DataContext = new MainWindowViewModel();
            }
         }  

背后的代码

    using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Tabs.ViewModel
{
    class MainWindowViewModel : INotifyPropertyChanged
    {
        private MainViewModel mainViewModel;

        public MainWindowViewModel()
        {
            mainViewModel = new MainViewModel();

        }

        public MainViewModel MainViewModel
        {
            get
            {
                return mainViewModel;
            }

            set
            {
                mainViewModel = value;
            }
        }

        public event PropertyChangedEventHandler PropertyChanged;
    }
}

我的MainWindowViewModel

using GalaSoft.MvvmLight;
using Tabs.ViewModel.Base;

namespace Tabs.ViewModel
{

    public class MainViewModel : ViewModelBase
    {

        public FirstViewModel FirstViewModel { get; set; }
        public SecondViewModel SecondViewModel { get; set; }
        public ThirdViewModel ThirdViewModel { get; set; }
        public MainViewModel()
        {
            FirstViewModel = new FirstViewModel();
            FirstViewModel.Text = "ehe"; //all i need is to show
            SecondViewModel = new SecondViewModel();
            ThirdViewModel = new ThirdViewModel();
        }
    }
}

我的MainViewModel

public class FirstViewModel:BaseViewModel
{
    private string _text;

    public string Text
    {
        get { return _text; }
        set { Set(() => Text, ref _text, value); }
    }

    public FirstViewModel()
    {

    }
}

我的FirstViewModel和我实际想要的文本字段

let response = JSON.parse('"3928593-236523632-2353253"');

1 个答案:

答案 0 :(得分:4)

您的文本块文本绑定中存在的问题如下:

Text="{Binding MainViewModel.FirstViewModel.Text}"

除了你的TextBlock在一个Grid中,它将datacontext设置为:

DataContext="{Binding MainViewModel.FirstViewModel}"

所以正在发生的事情是,它正在这个位置寻找你的文字:

MainViewModel.FirstViewModel.MainViewModel.FirstViewModel.Text

因为你的TextBlock的datacontext是你的FirstViewModel,如果你去 Text="{Binding DataContext}"你会看到这种情况。  
你想做的只是去:

Text="{Binding Text}"

附加说明:

原因是当你去Text="{Binding Text}"时,wpf会检查当前的datacontext元素,除非明确设置,否则它将始终与其父元素的DataContext相同。