trapemiyaの日記

hatenablogが新しくなったんで新規一転また2019年1月からちょこちょこ書いてます。C#中心のプログラミングに関するお話です。

添付プロパティに配列を渡す際のVisual Studio 2010 WPFデザイナーのバグ?

まずは下の画像を見て欲しいのですが、私には理解できないエラーが発生しています。

エラー内容は、以下の通りです。

DynamicResourceExtension"でInstanceBuilderExceptionがスローされました: 予期しない String[] の子: String[]

   場所 Microsoft.Expression.DesignModel.InstanceBuilders.ClrObjectInstanceBuilder.UpdatePropertyOrChildValue(IInstanceBuilderContext context, ViewNode viewNode, IProperty propertyKey, Int32 childIndex, DocumentNodeChangeAction action, DocumentNode valueNode)
   場所 Microsoft.Expression.DesignModel.InstanceBuilders.ClrObjectInstanceBuilder.InstantiateChild(IInstanceBuilderContext context, ViewNode viewNode, Int32 childIndex)
   場所 Microsoft.Expression.DesignModel.InstanceBuilders.ClrObjectInstanceBuilder.InstantiateChildren(IInstanceBuilderContext context, ViewNode viewNode, DocumentCompositeNode compositeNode, Boolean isNewInstance)
   場所 Microsoft.Expression.DesignModel.InstanceBuilders.ClrObjectInstanceBuilder.Instantiate(IInstanceBuilderContext context, ViewNode viewNode)
   場所 Microsoft.Expression.DesignModel.Core.ViewNodeManager.Instantiate(ViewNode viewNode)

再現するコードはいたってシンプルで、以下の通りです。

class SimpleClass
{
     public static readonly DependencyProperty TestArrayProperty =
          DependencyProperty.RegisterAttached("TestArray", typeof(string[]), typeof(SimpleClass),
                              new PropertyMetadata(null, new PropertyChangedCallback(TestArrayPropertyChangedCallback)));

     public static string[] GetTestArray(DependencyObject obj)
     {
          return (string[])obj.GetValue(TestArrayProperty);
     }

     public static void SetTestArray(DependencyObject obj, string[] value)
     {
          obj.SetValue(TestArrayProperty, value);
     }

     private static void TestArrayPropertyChangedCallback(DependencyObject d, DependencyPropertyChangedEventArgs e)
     {
          foreach (var str in (string[])e.NewValue)
               System.Diagnostics.Debug.WriteLine(str);
     }
}
<Window x:Class="WPFxArrayTest.MainWindow"
          xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
          xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
          Title="MainWindow" Height="350" Width="525"
          xmlns:local ="clr-namespace:WPFxArrayTest"
          xmlns:sys="clr-namespace:System;assembly=mscorlib"
          local:SimpleClass.TestArray="{DynamicResource stringArray}"
          >
     
     <Window.Resources>
          <x:Array x:Key="stringArray" Type="{x:Type sys:String}">
               <sys:String>0</sys:String>
               <sys:String>1</sys:String>
               <sys:String>2</sys:String>
               <sys:String>3</sys:String>
          </x:Array>
     </Window.Resources>
     
     <Grid />
     
</Window>

コンパイルもでき、実行も正しくされますので、デザイナに何らかの問題があるのではないかと思っています。もう少し調べたり、みなさんの意見を聞いて、バグ臭ければコネクトに出そうかと思います。