Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
WPF绑定源不是预期的DataContext_Wpf_Xaml_Binding - Fatal编程技术网

WPF绑定源不是预期的DataContext

WPF绑定源不是预期的DataContext,wpf,xaml,binding,Wpf,Xaml,Binding,我有一个简单的绑定问题,因为我觉得在我对绑定如何工作的看法中,我遗漏了一些基本的东西 我假设,因为我已经在代码隐藏中将MainWindow的DataContext设置为ViewModel,所以MainWindow.xaml中的所有绑定都将假定此DataContext的源,除非另有指定。当我使用我的UserControl(它本身有一个ViewModel驱动它)时,情况似乎并非如此 我的场景最好用代码来描述: MainWindow.xaml.cs private ViewModels.MainMen

我有一个简单的绑定问题,因为我觉得在我对绑定如何工作的看法中,我遗漏了一些基本的东西

我假设,因为我已经在代码隐藏中将MainWindow的DataContext设置为ViewModel,所以MainWindow.xaml中的所有绑定都将假定此DataContext的源,除非另有指定。当我使用我的UserControl(它本身有一个ViewModel驱动它)时,情况似乎并非如此

我的场景最好用代码来描述:

MainWindow.xaml.cs

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
    。看看这个,以正确的方式做

听起来你的uc超越了DC。在分配DC的地方张贴UC代码。您的回答是正确的。我在坎特伯雷大学超过了华盛顿特区。我现在改为设置UC根元素的DC。这是一个几乎100%的错误,因为根据OP发布的代码将错误的模型绑定到窗口的DataContext,re:
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')