コレクション (リスト) プロパティに、マークアップ拡張機能によって提供される値を入力しようとしています。コレクションを提供するプロパティにパブリック セッターがある場合、これを行うには問題があります。XAML 実装 (.NET 3.5 を使用) のバグだと思いますが、よくわかりません。
次のテストクラスを検討してください
[ContentProperty("SettableList")]
public class Test : FrameworkElement
{
List<string> _settableList = new List<string>();
List<string> _justGettableList = new List<string>();
public List<string> SettableList { get { return _settableList; } set { _settableList = value; } }
public List<string> JustGettableList { get { return _settableList; } }
}
次のマークアップ拡張機能は、文字列を提供するだけです。
public class ProvideStringExtension : MarkupExtension
{
public override object ProvideValue(IServiceProvider serviceProvider)
{
return "Blah";
}
}
これで、次のテスト ケースはすべて正常に動作します。
<!-- b) fill SettableList with explicit string: ok -->
<local:Test>
<local:Test.SettableList>
<sys:String>Hurz</sys:String>
</local:Test.SettableList>
</local:Test>
<!-- c) fill JustGettableList with string from markup extension: ok -->
<local:Test>
<local:Test.JustGettableList>
<local:ProvideStringExtension/>
</local:Test.JustGettableList>
</local:Test>
<!-- d) fill SettableList with string form markup extension by using "ContentProperty": ok -->
<local:Test>
<local:ProvideStringExtension/>
</local:Test>
しかし、このテスト ケースは失敗します。
<!-- e) fill SettableList with string from markup extension: FAILS -->
<!-- Throws (tries to convert the provided string to List<string>) -->
<local:Test>
<local:Test.SettableList>
<local:ProvideStringExtension/>
</local:Test.SettableList>
</local:Test>
失敗したケースでは、'string' を 'List' に変換できないという例外がスローされます。同様のケース d) と c) が正常に機能する場合、これが失敗する理由の説明はありますか?