KeyedCollection和d:DataContext设计错误

Ter*_*nce 3 c# wpf datacontext design-time visual-studio-2013

请参阅下面的VS2013更新.

当使用类作为d:DesignInstance暴露a 的类时KeyedCollection<TKey, TItem>,XAML设计器会抱怨以下警告:

提供的泛型参数的数量不等于泛型类型定义的arity.

参数名称:实例化

可以使用以下简单程序重现该问题:

<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; }
    }
}
Run Code Online (Sandbox Code Playgroud)

我无法为暴露的任何类提供设计时间形状KeyedCollection.

有什么想法在这里发生了什么?


更新:从VS2013开始,设计师处理a的行为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; }
    }
}
Run Code Online (Sandbox Code Playgroud)

Ter*_*nce 11

我已经能够通过在设计实例类型前面添加"d:Type"来解决这个问题:

d:DataContext="{d:DesignInstance d:Type=local:MyClass}"
Run Code Online (Sandbox Code Playgroud)

这似乎是VS2013设计师的一个错误.我相信d:Type属性应该是属性的默认d:DesignInstance属性.另外,奇怪的是我只在KeyedCollection班上看过这个问题.

此外,MSDN例子d:DesignInstance使用有时使用"类型",没有前缀.在此示例中,如果d:Type省略或缺少前缀,则会像我提到的那样生成设计时错误.