C# 创建窗口时出现BindingExpression路径错误(尚未绑定VM)
我试图遵循MVVM模式,但我很难将VM属性绑定到我的UserControl的依赖属性。我不确定初始化流程是否完全错误,或者只是遗漏了一个细节 以下是我的应用程序启动事件处理程序: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(
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