Я пытаюсь заполнить свойство коллекции (списка) значениями, предоставленными расширением разметки.Это проблема, если свойство, предоставляющее коллекцию, имеет открытый установщик.Я думаю, что это ошибка в реализации 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";
}
}
Теперь все следующие тестовые примеры работают нормально: Hurz
<!-- 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>
Сбойcase выдает исключение, говорящее, что 'string' нельзя преобразовать в 'List'.Есть ли объяснение, почему это не удается, когда аналогичные случаи г) и в) работают нормально?