在类型上找不到匹配的构造函数

时间:2013-01-27 20:32:33

标签: c# silverlight windows-phone-7 xaml exception-handling

我正在使用Visual Studio Express 2012 for Windows Phone制作Windows Phone 7.1应用程序。

我将此命名空间添加到MainPage.xaml:

xmlns:myNameSpace="clr-namespace:MyApp"

而且:

<Grid.Resources>
        <myNameSpace:MyClass x:Key="referenceToMyClass" />
</Grid.Resources>

在同一个文件中使用如下:

<ListBox Name="MyListBox"
         Height="{Binding ElementName=ContentPanel, Path=Height}"
         Width="{Binding ElementName=ContentPanel, Path=Width}"
         ItemsSource="{StaticResource referenceToMyClass}"
         DisplayMemberPath="MyAttribute" />

MyClass看起来像这样:

namespace MyApp
{
    class MyClass : ObservableCollection<AnotherClass>
    {
        public MyClass()
        {
            Class temp = new AnotherClass("Example attribute");
            Add(temp);
        }

        public void AddAnotherClass(AnotherClass anotherClass)
        {
            Add(anotherClass);
        }
    }
}

因此,当我尝试在手机上调试时,我收到以下错误:

  

System.Windows.dll中出现'System.Windows.Markup.XamlParseException'类型的第一次机会异常   附加信息:在“MyApp.MyClass”类型上找不到匹配的构造函数。

3 个答案:

答案 0 :(得分:17)

这是因为你的班级不公开。应该是

public class MyClass : ObservableCollection<AnotherClass>

XAML无法绑定到非公共对象/类/属性

答案 1 :(得分:2)

当您的代码在xaml对象的构造函数中引发MissingMethodException时,您也可能会遇到此异常:

public partial class MainWindow : Window
{
    public MainWindow()
    {
        InitializeComponent();

        var t = Activator.CreateInstance(typeof(T), typeof(int)); // Missing constructor
        // or:
        //this.GetType().InvokeMember("NonExistingMember", BindingFlags.Public | BindingFlags.Instance | BindingFlags.InvokeMethod, null, this, new object[0]);
    }
}

public class T
{}

xaml解析器错误地报告找不到MainWindow类的构造函数。调查抛出异常的“内部异常”揭示了失败的真正原因。

答案 2 :(得分:0)

我正在添加这个答案,希望它能为那些遇到同样问题的人提供一些帮助:

TeamCity未能构建多个依赖SilverLight项目,报告resgen.exe错误以及无处可见的普遍存在的错误代码。

我将SilverLight项目从v3升级到v5,这允许TeamCity构建,但其中一个SilverLight屏幕未显示任何内容,没有使用FireFox报告错误。

通过使用Visual Studio 2010和IE进行调试,我得到了与OP相同的错误信息,并且在调用InitializeComponent()时发生了变化,但区别在于该类已经公开了?!

问题在于升级的项目遇到了resource.resx文件的问题,在完全从SilverLight项目中删除它们后,整个过程按预期工作。