Не удается заполнить свойство коллекции расширениями разметки в XAML - PullRequest
1 голос
/ 08 апреля 2011

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

1 Ответ

0 голосов
/ 08 апреля 2011

Первое, что попытается сделать синтаксический анализатор XAML, это взять полученное вами значение и "установить" для свойства это значение. Итак, он хочет сделать это:

this.SettableList = ProvideStringExtension.ProvideValue();

Если нет установщика и свойство реализует ICollection (может быть, я забыл IList), то он попытается добавить элемент в коллекцию:

this.JusetGettableList.Add(ProvideStringExtension.ProvideValue())

Возможно, они могли бы изменить эту логику, но я уверен, что был сделан выбор дизайна, чтобы сделать это таким образом.

Кроме того, я верю, что даже если сеттер является частным, он все равно потерпит неудачу. Но это могло быть исправлено.

...