C# xaml d:DataContext-giving;“访问被拒绝”;错误

C# xaml d:DataContext-giving;“访问被拒绝”;错误,c#,wpf,visual-studio,xaml,intellisense,C#,Wpf,Visual Studio,Xaml,Intellisense,我阅读了以下关于VS2013中提供的新xaml编辑功能的博文: 数据绑定Intellisense是我多年来一直想要的东西,所以我尝试了一下——但不幸的是,它在错误列表中返回了一个错误(尽管它仍然构建良好) 这是我在UserControl声明/标记中添加的内容: d:DataContext="{d:DesignInstance Type=lTemplates:TemplateEditorCustomVM}" 这是列表中的错误: 错误95访问被拒绝:System.Collections.Obje

我阅读了以下关于VS2013中提供的新xaml编辑功能的博文:

数据绑定Intellisense是我多年来一直想要的东西,所以我尝试了一下——但不幸的是,它在错误列表中返回了一个错误(尽管它仍然构建良好)

这是我在UserControl声明/标记中添加的内容:

d:DataContext="{d:DesignInstance Type=lTemplates:TemplateEditorCustomVM}"
这是列表中的错误:

错误95访问被拒绝:
System.Collections.ObjectModel.ObservableCollection'1[\u1.di1.TemplateEditorCustomVM+TemplateCriteriaVM]。

我不完全确定它试图做什么,这两个类都声明为public(主视图模型和嵌套类)

有人有什么想法吗

如果不是,那也不是世界末日,因为资源密钥Intellisense似乎可以工作,这仍然是一个巨大的奖金

编辑

好的-我将嵌套类移出公共名称空间,VS给了我一个更详细的错误:

错误64
尝试使用方法“\u1.Templates.TemplateEditorCustomVM..ctor()”访问方法“System.ComponentModel.BindingList”1..ctor()”
失败

我有点困惑,我必须说:

首先,为什么intellisense需要实例化VM类,它只需要关心哪些属性可用以及它们是什么类型——所有这些都可以通过反射进行检索

其次,我不明白为什么当应用程序启动时运行正常时会出错

我可能不得不使用老把戏,让VisualStudio自己调试设计器来查看它试图做什么

进一步编辑

对,我将BindingList属性更改为直接列表属性(因为BindingList来自WinForms方面,所以我认为这可能值得更改以了解它的功能)。但我也犯了一个类似的错误:

错误64
尝试使用方法“\u3.Templates.TemplateEditorCustomVM..ctor()”访问方法“System.Collections.Generic.List'1..ctor()”失败。

我在系统上快速搜索了一下。佳能和它只是一个优化细节:

虽然还没有接近了解到底发生了什么,但我会继续深入挖掘

编辑-现在有一个回购协议

是的,出于好奇,我开始对虚拟机的大量内容进行评论,试图弄清问题的真相——现在我有了一个虚拟机类,它似乎重现了这个问题:

public class Nested
{
    public class TestCheck
    {
        public int One { get; set; }
        public int Two { get; set; }
    }
}

public class SanityTestVM
{
    public List<Nested.TestCheck> Test { get; set; }
} 
公共类嵌套
{
公共类测试检查
{
公共int One{get;set;}
公共整数二{get;set;}
}
}
公共类SanityTestVM
{
公共列表测试{get;set;}
} 
给出:

错误14方法
'.di14.Templates.SanityTestVM..ctor()'尝试访问方法'System.Collections.Generic.List'1..ctor()'失败。

问题似乎是有一个列表,它的类型有一个嵌套类-如果它是一个普通类(非嵌套),那么一切都很好

我想我需要为此提交一个连接案例-在我提交之前,有人能够确认这一点,我在Windows 8.1机器上有4个版本的VS,我只想排除开发环境

我认为“Type=lTemplates:TemplateEditorCustomVM”不是必需的。我从XAML页面以这种方式使用MVVM和datacontext:

<Page.DataContext>
    <Binding Mode="OneWay" Path="YourProperty" Source="{StaticResource ViewModelLocator}"/>
</Page.DataContext>

然后在App.xaml中,我有一个静态资源,可以从任何页面引用:

 <locator:ViewModelLocator p6:Key="ViewModelLocator" xmlns:p6="http://schemas.microsoft.com/winfx/2006/xaml"/>

我建议您以这种方式加载设计时数据,因为您可以更好地控制要在设计器上显示的设计时数据


希望有帮助。

我总是这样使用d:DataContext

<UserControl ....
            lTemplates="clr-namespace:Your Path"
             d:DataContext="{d:DesignInstance lTemplates:TemplateEditorCustomVM}">
....
</UserControl>

....

一切正常。

默认情况下,设计师正在尝试启动构造函数。这样做可能是为了允许VM和其他实体的创建者在设计时启动一些测试数据,否则所有字符串通常为空,大多数数字为零

在您的例子中,似乎有一个内部属性未初始化(null),绑定正在尝试访问该属性的内部成员

如果您感兴趣的只是智能,而不需要设计师提供“真实”数据,您可以使用:

d:DataContext="{d:DesignInstance Type=lTemplates:TemplateEditorCustomVM
                                 IsDesignTimeCreatable=False}"
如果您希望避免上述解决方案,并在设计时拥有一些测试数据,那么在类的构造函数中,您可以拥有:

if(DesignerProperties.GetIsInDesignMode(new DependencyObject()))
  {
      FillDummyData();
  }

看起来这确实是VS2013中的一个bug——我已经询问了一些同事,看看他们是否可以复制它,他们也可以,所以这不仅仅是我的环境

我已经提交了一个连接案例-因此,如果其他人遇到此错误,请随意投票:

该问题是由视图模型引起的,该视图模型包含具有泛型定义的属性,该泛型定义包含嵌套类类型:

public class AClass
{
    public class AnotherClass
    {
        public int AProperty { get; set; }
    }
}

class TestVM
{
    public List<AClass.AnotherClass> NestedTypeList { get; set; }
}
公共类AClass
{
公共类另一类
{
公共int属性{get;set;}
}
}
类TestVM
{
公共列表嵌套类型列表{get;set;}
}
XAML:


给出:

错误1方法“\u1.di1.WpfApplication1.TestVM..ctor()”尝试访问方法“System.Collections.Generic.List'1..ctor()”失败。


TemplateEditorCustomVM
看起来像什么?(如果可以简化为几个简单的属性来复制错误的话)。我将看看是否可以将其减少到导致错误的属性。您可能会自己解决它=D我试图重新设置问题,但似乎无法管理它。仍然无法复制问题,不知道这是否相关?这可能是一个安全问题,我刚刚尝试使用admin privs运行VS,但不幸的是没有区别。您好,谢谢您的回答,但这不是设计时数据本身的错误-我没有使用Expression Blend。我想要的是VS2013中xaml编辑器中新的intellisense功能
<Window x:Class="WpfApplication1.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:WpfApplication1"
        mc:Ignorable="d"
        d:DataContext="{d:DesignInstance Type=local:TestVM}"
        Title="MainWindow" Height="354" Width="535">
    <Grid>
    </Grid>
</Window>