Search code examples
c#wpfvisual-studio-2013datacontextdesign-time

KeyedCollection and d:DataContext Design Error


See the update below for VS2013.

When using a class as a d:DesignInstance that exposes a KeyedCollection<TKey, TItem>, the XAML designer complains with the following warning:

The number of generic arguments provided doesn't equal the arity of the generic type definition.

Parameter name: instantiation

The problem can be reproduced with the following simple program:

<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; }
    }
}

I'm unable to provide design time shape with any class that exposes a KeyedCollection.

Any ideas what is going on here?


Update: As of VS2013 the behavior of the designer in dealing with a KeyedCollection has changed (though still not fully working).

The above example no longer generates an error. However, if the KeyedCollection uses certain types (such as an interface) as the TItem the following error is generated:

Object reference not set to an instance of an object.

Consider the following example:

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; }
    }
}

Solution

  • I've been able to resolve this issue by prefixing the design instance type with "d:Type" as such:

    d:DataContext="{d:DesignInstance d:Type=local:MyClass}"
    

    This seems to be a bug in the VS2013 designer. I believe the d:Type property should be the default property of the d:DesignInstance attribute. Also, strangely I've only seen this issue with the KeyedCollection class.

    Furthermore, the MSDN examples of d:DesignInstance usage sometimes use "Type" with no prefix. In this example if d:Type is omitted or the prefix is missing, the design time error is generated as I mentioned.