KeyedCollection и d: Ошибка дизайна DataContext

См. обновление ниже для VS2013.

При использовании класса в качестве d:DesignInstance, который предоставляет KeyedCollection<TKey, TItem>, конструктор XAML выдает следующее предупреждение:

Количество предоставляемых универсальных аргументов не равно арности определения универсального типа.

Имя параметра: создание экземпляра

Задачу можно воспроизвести с помощью следующей простой программы:

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

person Terrence    schedule 22.02.2013    source источник


Ответы (3)


Мне удалось решить эту проблему, поставив перед типом экземпляра проекта префикс «d: Type» как таковой:

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

Кажется, это ошибка в дизайнере VS2013. Я считаю, что свойство d:Type должно быть свойством по умолчанию для атрибута d:DesignInstance. Кроме того, как ни странно, я видел эту проблему только с классом KeyedCollection.

Кроме того, примеры MSDN использования d:DesignInstance иногда используют "Type " без префикса. В этом примере, если d:Type опущено или отсутствует префикс, генерируется ошибка времени разработки, как я уже упоминал.

person Terrence    schedule 10.02.2014
comment
Кажется, существует и в VS2015. - person Stefan; 24.11.2015

Если я правильно понял ваш вопрос, попробуйте

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

Я надеюсь, это поможет.

person yo chauhan    schedule 22.02.2013
comment
Спасибо, но это не совсем решает мою конкретную проблему. Мне особенно нужно использовать d: DataContext для предоставления формы данных времени разработки в конструкторе XAML. Я установил фактический DataContext по-другому. Дополнительные сведения о данных времени разработки см. здесь: karlshifflett.wordpress.com/2009/10/28/ - person Terrence; 24.02.2013

Мне пришлось удалить конструктор по умолчанию из моего класса DesignInstance.

person Markus Weber    schedule 05.09.2015