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
C# 创建窗口时出现BindingExpression路径错误(尚未绑定VM)_C#_Wpf_Mvvm - Fatal编程技术网

C# 创建窗口时出现BindingExpression路径错误(尚未绑定VM)

C# 创建窗口时出现BindingExpression路径错误(尚未绑定VM),c#,wpf,mvvm,C#,Wpf,Mvvm,我试图遵循MVVM模式,但我很难将VM属性绑定到我的UserControl的依赖属性。我不确定初始化流程是否完全错误,或者只是遗漏了一个细节 以下是我的应用程序启动事件处理程序: private void Application_Startup(object sender, StartupEventArgs e) { MainViewModel viewModel = new MainViewModel(); MainWindow window = new MainWindow(

我试图遵循MVVM模式,但我很难将VM属性绑定到我的UserControl的依赖属性。我不确定初始化流程是否完全错误,或者只是遗漏了一个细节

以下是我的应用程序启动事件处理程序:

private void Application_Startup(object sender, StartupEventArgs e)
{
    MainViewModel viewModel = new MainViewModel();
    MainWindow window = new MainWindow();
    viewModel.BindView(window);
    window.Show();
}
public static void BindView(this ViewModelBase viewModel, Control i_control)
{
    i_control.DataContext = viewModel;
}
这是我的
MainViewModel
ViewModelBase
来自MVVM Light):

这是我的
主窗口。xaml

<Window x:Class="WST_Desktop.MainWindow"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    xmlns:local="clr-namespace:WST_Desktop"
    xmlns:controls="clr-namespace:WST_Desktop.Controls"
    mc:Ignorable="d"
    Title="MainWindow" Height="540" Width="960">
    <Grid>
        <Grid.RowDefinitions>
            <RowDefinition Height="Auto" />
            <RowDefinition />
        </Grid.RowDefinitions>

        <controls:ProjectControl Project="{Binding Path=CurrentProject, Converter={wstd:DebugConverter}}" />
    </Grid>
</Window>
启动处理程序中的
new main window()
行会报告此错误。此外,附加到绑定的
DebugConverter
I也不会被命中

我想我知道主窗口是在没有DataContext的情况下创建的(它将在下一行中绑定),因此它无法绑定ViewModel的属性(当然,它还不知道)。我说得对吗?我该如何解决这个问题

PS 当然,
ProjectControl
有一个名为
Project
的公共属性,其类型正确

这是在启动事件处理程序中调用的
BindView
方法:

private void Application_Startup(object sender, StartupEventArgs e)
{
    MainViewModel viewModel = new MainViewModel();
    MainWindow window = new MainWindow();
    viewModel.BindView(window);
    window.Show();
}
public static void BindView(this ViewModelBase viewModel, Control i_control)
{
    i_control.DataContext = viewModel;
}
这基本上转化为

window.DataContext = viewModel;

更多信息

我试图改变这个

<controls:ProjectControl Project="{Binding Path=CurrentProject, Converter={wstd:DebugConverter}}" />

对此

<controls:ProjectControl DataContext="{Binding Path=CurrentProject, Converter={wstd:DebugConverter}}" />


错误消失了。但是,我不确定哪一个是正确的:
Project
对象(类似于我的
ProjectControl
的“根”模型对象)应该是依赖属性还是DataContext?

这是什么
BindView
方法

试试看

window.DataContext = viewModel;
而不是

viewModel.BindView(window);
编辑:可以,因为错误消息表明您正在查找类型为
Project
的对象上的
CurrentProject
属性。我建议您也将
网格的
数据上下文
绑定到
视图模型
。这应该能解决你的问题

要验证是否解决了问题,只需调整绑定即可

 <Grid DataContext="{Binding ElementName=foo, Path=DataContext}">


并设置窗口的名称
name=“foo”

这是什么
BindView
方法

试试看

window.DataContext = viewModel;
而不是

viewModel.BindView(window);
编辑:可以,因为错误消息表明您正在查找类型为
Project
的对象上的
CurrentProject
属性。我建议您也将
网格的
数据上下文
绑定到
视图模型
。这应该能解决你的问题

要验证是否解决了问题,只需调整绑定即可

 <Grid DataContext="{Binding ElementName=foo, Path=DataContext}">


然后设置窗口的名称,让我们看看这个绑定错误是怎么回事:

BindingExpression路径错误:在上找不到“CurrentProject”属性 “对象”“项目”(HashCode=30400195)。
BindingExpression:Path=CurrentProject;DataItem='Project' (HashCode=30400195)
目标元素是“ProjectControl”(名称=“”);目标属性为“Project”(类型为“Project”)

你可以从中得到很多信息

首先,绑定引擎告诉您,
绑定
路径
属性中存在错误,因为绑定引擎在用作当前
数据上下文
的对象上找不到名为
CurrentProject
的属性。您应该知道,当您没有明确指定不同的源时(例如,使用
ElementName
绑定的
源属性),绑定引擎使用
DataContext
对象作为源

绑定引擎还声明,当前的
DataContext
对象属于
Project
类型,而不是
MainViewModel
类型。这是一个事实,应该让你看起来可疑的代码

第二行只是重复信息:
DataContext
(或此消息中的
DataItem
)是类型为
Project
的对象,我们正在尝试获取其属性
CurrentProject
(这显然是不可能的,因为此属性不存在)

第三行显示了
绑定
的目标:它是
ProjectControl
类型的对象,其属性名为
Project
(类型为
Project

总结:绑定引擎正在处理的视图模型不是您认为要绑定到的视图模型。对此只有一种解释:在某个地方,有一些代码或另一个
绑定
,将视图的
DataContext
设置为
Project
类型的对象


正如您在评论中提到的,您已经在代码中发现了这一点。

让我们看看这个绑定错误是怎么回事:

BindingExpression路径错误:在上找不到“CurrentProject”属性 “对象”“项目”(HashCode=30400195)。
BindingExpression:Path=CurrentProject;DataItem='Project' (HashCode=30400195)
目标元素是“ProjectControl”(名称=“”);目标属性为“Project”(类型为“Project”)

你可以从中得到很多信息

首先,绑定引擎告诉您,
绑定
路径
属性中存在错误,因为绑定引擎在用作当前
数据上下文
的对象上找不到名为
CurrentProject
的属性。您应该知道,当您没有明确指定不同的源时(例如,使用
ElementName
绑定的
源属性),绑定引擎使用
DataContext
对象作为源

绑定引擎还声明,当前的
DataContext
对象属于
Project
类型,而不是
MainViewModel
类型。这是一个事实,应该让你看起来可疑的代码

第二行只是重复信息:
DataContext
(或
Da