WPF绑定源不是预期的DataContext
我有一个简单的绑定问题,因为我觉得在我对绑定如何工作的看法中,我遗漏了一些基本的东西 我假设,因为我已经在代码隐藏中将MainWindow的DataContext设置为ViewModel,所以MainWindow.xaml中的所有绑定都将假定此DataContext的源,除非另有指定。当我使用我的UserControl(它本身有一个ViewModel驱动它)时,情况似乎并非如此 我的场景最好用代码来描述: MainWindow.xaml.csWPF绑定源不是预期的DataContext,wpf,xaml,binding,Wpf,Xaml,Binding,我有一个简单的绑定问题,因为我觉得在我对绑定如何工作的看法中,我遗漏了一些基本的东西 我假设,因为我已经在代码隐藏中将MainWindow的DataContext设置为ViewModel,所以MainWindow.xaml中的所有绑定都将假定此DataContext的源,除非另有指定。当我使用我的UserControl(它本身有一个ViewModel驱动它)时,情况似乎并非如此 我的场景最好用代码来描述: MainWindow.xaml.cs private ViewModels.MainMen
private ViewModels.MainMenuViewModel vm;
public MainWindow()
{
InitializeComponent();
vm = new ViewModels.MainMenuViewModel();
this.DataContext = vm;
}
MainWindow.xaml(使用代码隐藏中设置的数据上下文)
使用这种方法,MainWindow.xaml中的binding语句会出错。查看Snoop绑定错误,它声明在MachineView模型中未找到CurrentDocument属性
System.Windows.Data Error: 40 : BindingExpression path error: 'CurrentDocument' property not found on 'object' ''MachineViewModel' (HashCode=27598891)'. BindingExpression:Path=CurrentDocument; DataItem='MachineViewModel' (HashCode=27598891); target element is 'MachineTreeView' (Name='MachineTreeView'); target property is 'MachineDocument' (type 'MachineDocument')
在主窗口中进行绑定时,为什么要查看机器设备模型
MainWindow中的其他绑定属性按预期工作,但这是我仅有的UserControl绑定。或者这是一个简单的错误
- 您正在将
而不是MainMenuViewModel
设置为MainWindowViewModel
MainWindow.DataContext
- 您以错误的方式为UserControl设置了
。看看这个,以正确的方式做DataContext
MainMenuViewModel
vs.MainWindowViewModel
。好主意。谢谢LPL,你在上面指出的简单错误是对的(不幸的是,这是提交问题时不小心复制/粘贴的结果)…真正的帮助是创建可重用UC的模式链接。我将UserControl的DataContext设置为该UC的ViewModel。我现在已经改变了这一点,设置了UC根元素的DataContext,所有的工作都非常出色!谢谢你的帮助。
public class MainWindowViewModel : ObservableObject
{
public MainWindowViewModel()
{
OpenMachine(@"D:\Projects\Agnes\EditorWPF\Test.machine");
}
private void OpenMachine(string filePath)
{
MachineDocument currentDocument = MachineDocument.OpenFile(filePath);
CurrentDocument = currentDocument;
}
private MachineDocument _currentDocument;
public MachineDocument CurrentDocument
{
get { return _currentDocument; }
set
{
if (_currentDocument != null)
{
_currentDocument.Dispose();
_currentDocument = null;
}
_currentDocument = value;
base.RaisePropertyChanged("CurrentDocument"); //this fires
}
}
System.Windows.Data Error: 40 : BindingExpression path error: 'CurrentDocument' property not found on 'object' ''MachineViewModel' (HashCode=27598891)'. BindingExpression:Path=CurrentDocument; DataItem='MachineViewModel' (HashCode=27598891); target element is 'MachineTreeView' (Name='MachineTreeView'); target property is 'MachineDocument' (type 'MachineDocument')