我有一个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"');
答案 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相同。