尝试编译WPF应用程序时出现奇怪的循环依赖问题

时间:2014-02-12 21:09:34

标签: wpf xaml circular-dependency

这是一个简单的问题,有人肯定知道如何解决。

我有一个完美编译的WPF应用程序。

我决定向ListView添加功能,因此我将ListView类扩展为ListViewEx。

我进入了我的XAML代码并将所有ListView标签更改为ListViewEx。

现在应用程序将无法编译,声称ListViewEx不存在。但它不存在,因为它尚未编译,并且它不会编译,因为XAML认为它不存在!

我可以编译的唯一方法是从XAML中完全删除引用新类的所有标记,编译项目,以便在XAML查找它时存在新类,然后我可以添加标记它会编译好。

这是设计的行为吗?

Circular Dependency

注意四件事。

  1. ListViewEx确实存在于FilePublisher命名空间中。 (与错误信息相矛盾)
  2. MainForm的XAML将FilePublisher命名空间声明为“p”
  3. “p:ListViewEx”在XAML中引用
  4. lstFile确实存在于MainForm中(请参阅XAML标记Name =“lstFiles”)(与错误消息相矛盾)
  5. 问题是XAML设计器正在引用它正在尝试编译的DLL。它期望ListViewEx已经存在,并且因为它尚未编译,它在DLL中不存在。因此,设计器不会像它应该那样在主窗体的部分类上自动生成lstFiles属性,因此,项目将无法编译,因为代码引用了lstFiles。因此它不会编译,因为它正在尝试编译的东西中尚不存在某些东西!这是一个循环依赖,它可以100%重现。

3 个答案:

答案 0 :(得分:1)

我发现了问题。

由于Visual Studio没有在自动生成的代码中自动创建lstFiles属性,因为它应该一直在做(当标签只是ListView而不是p:ListViewEx时,我正在做),我尝试手动添加lstFiles属于我的班级,然后它给了我一个更有用的错误信息:

  

由于'ListViewEx'是在同一个程序集中实现的,因此必须进行设置   x:Name属性而不是Name属性。

因此,解决方案是确保在同一程序集中的自定义命名空间中使用控件时,必须使用“x:Name”而不是“Name”属性声明它。好的。

答案 1 :(得分:0)

我经常使用那个逻辑,并且它有效。我猜测issu来自命名空间。确保在clr-namespace中没有程序集名称,因为该类型在同一程序集中

<Window... 
        xmlns:custom="clr-namespace:MyCustomListViewNamespace" >
...
     <custom:ListViewEx ... />
</Window>

答案 2 :(得分:0)

我曾多次遇到过你所描述的相同问题:循环依赖,其中C#中的类尚未编译,但已在xaml中引用,导致错误并阻止编译。

不幸的是,我找到的唯一解决方案是:

  • 保存并关闭所有文档(可选择执行虚拟提交);
  • 在XAML中查找新类的每个匹配项;
  • 在你无法编译之前注释掉XAML;
  • 回滚评论:
    • 转到每个打开的XAML文件并按CTRL + Z多次重置它,然后保存。
    • (可选)执行某些版本控制重置/恢复,例如git reset --hard

现在,您应该能够使用XAML中提供的引用构建解决方案。