c# - 创建 Window 时出现 BindingExpression 路径错误(尚未绑定(bind) VM)

标签 c# wpf mvvm

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

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

private void Application_Startup(object sender, StartupEventArgs e)
{
    MainViewModel viewModel = new MainViewModel();
    MainWindow window = new MainWindow();
    viewModel.BindView(window);
    window.Show();
}

这是我的MainViewModel (ViewModelBase 来自 MVVM Light):
public class MainViewModel : ViewModelBase
{
    private Project m_currentProject = new Project();
    public Project CurrentProject
    {
        get { return m_currentProject; }
        private set
        {
            m_currentProject = value;
        }
    }
}

这是我的MainWindow.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>

我从 DataBinding 监听器收到此错误(为便于阅读而断行):
BindingExpression path error: 'CurrentProject' property not found on 'object' ''Project' (HashCode=30400195)'. 
BindingExpression:Path=CurrentProject; DataItem='Project' (HashCode=30400195); 
target element is 'ProjectControl' (Name=''); target property is 'Project' (type 'Project')

错误在 new MainWindow() 行报告从启动处理程序。此外,DebugConverter我附在绑定(bind)上是从来不打的。

我想我知道 MainWindow 是在没有 DataContext 的情况下创建的(它将在下一行中绑定(bind)),因此它无法绑定(bind) ViewModel 的属性(当然,它还不知道)。我对么?我该如何解决?

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

这是BindView在 Startup 事件处理程序中调用的方法:
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?

最佳答案

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

BindingExpression path error: 'CurrentProject' property not found on 'object' ''Project' (HashCode=30400195)'.
BindingExpression:Path=CurrentProject; DataItem='Project' (HashCode=30400195);
target element is 'ProjectControl' (Name=''); target property is 'Project' (type 'Project')



你可以从中得到很多信息。

首先,绑定(bind)引擎告诉您Path 中有错误。您的 Binding 的属性(property),因为绑定(bind)引擎找不到名为 CurrentProject 的属性在用作当前 DataContext 的对象上.您应该知道,绑定(bind)引擎使用 DataContext当您没有明确指定不同的源时(例如,使用 ElementNameSourceBinding 属性),对象作为源。

绑定(bind)引擎还指出,当前 DataContext对象的类型为 Project而不是 MainViewModel 类型.事实应该使您对代码感到怀疑。

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

第三行显示您的 Binding的目标:它是 ProjectControl 类型的对象及其名为 Project 的属性(类型为 Project )。

总结一下:绑定(bind)引擎正在处理的 View 模型不是您认为要绑定(bind)的 View 模型。对此只有一种解释:某处,有一些代码或另一个 Binding设置 View 的 DataContextProject 类型的对象.

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

关于c# - 创建 Window 时出现 BindingExpression 路径错误(尚未绑定(bind) VM),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46172167/

相关文章:

C# - 具有环列表行为的字典?

c# - 返回 Controller 中的 Linq 值并将其传递给 View

c# - 获得唯一的机器ID

c# - 什么是 Visual Studio SDK 中 VirtualSnapshotSpan 中的虚拟空间

silverlight - 带有 Silverlight 的 MVVM

mvvm - 带有 Caliburn Micro 的 AvalonDock 2

c# - 将对象属性转换为不同的可视对象

c# - Model/ViewModel 设计中的类继承错误

c# - 使用 wpf 应用程序读取条形码

c# - Application.LoadComponent 的线程错误( key 已存在)