Lightness Asked:2020-09-25 01:43:43 +0000 UTC2020-09-25 01:43:43 +0000 UTC 2020-09-25 01:43:43 +0000 UTC WPF 设计器抱怨缺少默认构造函数 772 DataContext VM-ку当我为没有默认构造函数的设计师指定时,他总是发誓。如何纠正这种情况? d:DataContext="{d:DesignInstance local:AuthenticationVm, IsDesignTimeCreatable=True}" c# 1 个回答 Voted Best Answer VladD 2020-09-25T02:15:04Z2020-09-25T02:15:04Z 如果有IsDesignTimeCreatable=True,WPF 设计器将尝试创建此类的对象,并将其用作DataContext渲染器。为此,它需要一个无参数的构造函数。 如果有IsDesignTimeCreatable=False,WPF 设计器将不会尝试创建该对象。相反,它将创建自己具有相同公共属性的假数据类型,将其实例化,并将其用作DataContext'a. 当您指定 时IsDesignTimeCreatable=False,您将不再在设计器中看到数据。这可能不是很方便。这是一种更高级的方法,即使您的 VM 没有不带参数的构造函数,您也可以在设计器中查看数据。 为此,您需要为设计器创建数据。假设我们有以下 VM 类: class VM { public VM(string text) { Text = text; } public string Text { get; } } 正如我们所看到的,这个类没有无参数的构造函数,它的属性也没有setter。这对我们来说不是障碍。 我们在项目中启动一个ResourceDictionary(随便叫什么DesignDictionary.xaml,具体名字不重要)。创建它时,它看起来像这样: <ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:local="clr-namespace:MyCoolProject"> </ResourceDictionary> 删除所有 (!) 并将其替换为您的 VM 类的实例声明: <local:VM xmlns:local="clr-namespace:MyCoolProject" Text="Design Text"/> 现在转到文件的属性,设置Build Action = DesignData并删除它Custom Tool: 现在可以像这样使用这个实例: <Grid d:DataContext="{d:DesignData Source=DesignDictionary.xaml}"> <TextBlock Text="{Binding Text}"/> </Grid> 不要忘记重新编译项目。现在设计器显示数据: 就是这样,我们绕过了 WPF 设计器的限制。 参考资料:MSDN/WPF Designer 博客/ WPF 和 Silverlight Designer 中的示例数据。 解决该问题的另一个想法是创建一个具有默认构造函数的特殊派生类(仅供设计器使用)。此构造函数将使用一些适当的参数调用基本构造函数。为避免在实际代码中意外使用此类,您可以将[Obsolete].
如果有
IsDesignTimeCreatable=True,WPF 设计器将尝试创建此类的对象,并将其用作DataContext渲染器。为此,它需要一个无参数的构造函数。如果有
IsDesignTimeCreatable=False,WPF 设计器将不会尝试创建该对象。相反,它将创建自己具有相同公共属性的假数据类型,将其实例化,并将其用作DataContext'a.当您指定 时
IsDesignTimeCreatable=False,您将不再在设计器中看到数据。这可能不是很方便。这是一种更高级的方法,即使您的 VM 没有不带参数的构造函数,您也可以在设计器中查看数据。为此,您需要为设计器创建数据。假设我们有以下 VM 类:
正如我们所看到的,这个类没有无参数的构造函数,它的属性也没有setter。这对我们来说不是障碍。
我们在项目中启动一个ResourceDictionary(随便叫什么
DesignDictionary.xaml,具体名字不重要)。创建它时,它看起来像这样:删除所有 (!) 并将其替换为您的 VM 类的实例声明:
现在转到文件的属性,设置
Build Action = DesignData并删除它Custom Tool:现在可以像这样使用这个实例:
不要忘记重新编译项目。现在设计器显示数据:
就是这样,我们绕过了 WPF 设计器的限制。
参考资料:MSDN/WPF Designer 博客/ WPF 和 Silverlight Designer 中的示例数据。
解决该问题的另一个想法是创建一个具有默认构造函数的特殊派生类(仅供设计器使用)。此构造函数将使用一些适当的参数调用基本构造函数。为避免在实际代码中意外使用此类,您可以将
[Obsolete].