请参阅下面的VS2013更新。
当使用类d:DesignInstance
暴露KeyedCollection<TKey, TItem>
时,XAML设计师会抱怨以下警告:
提供的通用参数的数量不等于 泛型类型定义。
参数名称:instantiation
可以使用以下简单程序重现该问题:
<Window x:Class="Test.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:local="clr-namespace:Test"
mc:Ignorable="d"
d:DataContext="{d:DesignInstance local:MyClass}" />
namespace Test
{
public partial class MainWindow : Window
{
public MainWindow() { InitializeComponent(); }
}
public class MyClass
{
public KeyedCollection<string, object> SettingsModule { get; private set; }
}
}
我无法为任何公开KeyedCollection
的类提供设计时间形状。
这里有什么想法?
更新:从VS2013开始,设计师处理KeyedCollection
的行为已经改变(尽管仍未完全发挥作用)。
以上示例不再生成错误。但是,如果KeyedCollection
使用某些类型(例如接口)作为TItem
,则会生成以下错误:
对象引用未设置为对象的实例。
考虑以下示例:
namespace Test
{
public partial class MainWindow : Window
{
public MainWindow() { InitializeComponent(); }
}
public class MyClass
{
public KeyedCollection<string, IInterface> MyCollection { get; private set; }
}
public interface IInterface
{
string Name { get; set; }
}
}
答案 0 :(得分:11)
我已经能够通过在设计实例类型前面添加“d:Type”来解决这个问题:
d:DataContext="{d:DesignInstance d:Type=local:MyClass}"
这似乎是VS2013设计师的一个错误。我相信d:Type属性应该是d:DesignInstance
属性的默认属性。另外,奇怪的是我只在KeyedCollection
类中看到了这个问题。
此外,d:DesignInstance
使用的MSDN examples有时使用没有前缀的“类型”。在此示例中,如果省略d:Type
或缺少前缀,则会按照我的提及生成设计时错误。
答案 1 :(得分:0)
如果我没有误解你的问题,请尝试
<Window x:Class="WpfApplication1.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="clr-namespace:WpfApplication1"
Width="800" Height="800"
Title="MainWindow"
>
<Window.DataContext>
**<local:MyClass />**
</Window.DataContext>
<Grid x:Name="LayoutRoot">
</Grid>
我希望这会有所帮助。
答案 2 :(得分:0)
我不得不从DesignInstance-Class
中删除Default Constructor