KeyedCollection和d:DataContext的设计错误(KeyedCollection

2019-07-20 09:45发布

请参阅下面的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; }
    }
}

Answer 1:

我已经能够通过前缀来设计实例类型来解决这个问题“d:类型”这样:

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

这似乎是在VS2013设计的错误。 我相信,d:Type属性应该是的默认属性d:DesignInstance属性。 而且,奇怪的是我只看到与这个问题KeyedCollection类。

此外, MSDN实例的d:DesignInstance用法有时使用“类型”,没有前缀。 在这个例子中,如果d:Type被省略或前缀丢失,则正如我所提到产生的设计时错误。



Answer 2:

如果我have'nt误解了你的问题,尝试喜欢

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

我希望这将有所帮助。



Answer 3:

我不得不从我DesignInstance级删除默认的构造函数



文章来源: KeyedCollection and d:DataContext Design Error