KeyedCollection和d:DataContext设计错误

时间:2013-02-22 18:00:07

标签: c# wpf visual-studio-2013 datacontext design-time

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

3 个答案:

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