Заполнение коллекции в XAML

Как заполнить коллекцию через интерфейс? Вот XAML:

    <local:ViewModel>
        <local:Test Text="Hmm!"/>
    </local:ViewModel>

Вот модель, которая работает:

[ContentProperty("Tests")]
public class ViewModel
{
    public List<Test> Tests { get; } = new List<Test>();
}

Куда:

public class Test
{
    public string Text { get; set; }
}

Я хотел бы пойти с интерфейсом, хотя:

[ContentProperty("Tests")]
public class ViewModel
{
    public IList<Test> Tests { get; } = new List<Test>();
}

К сожалению, он не компилируется:

Невозможно установить свойство содержимого "Тесты" для элемента "ViewModel". "Тесты" имеют неверный уровень доступа или его сборка не разрешает доступ.

Я на самом деле создать экземпляр PostSharp AdvisableCollection<T> и не хотел бы, чтобы клиентский код зависел от него.

0 ответов

XAML обрабатывается с использованием определений типов, представленных в XAML. Он не видит фактически используемых экземпляров.

Процессор XAML использует неуниверсальный IListинтерфейс для добавления элементов в коллекцию, а процессор генерирует код. ПосколькуIList<T> interface не реализует ни один из этих интерфейсов, элементы не могут быть добавлены в коллекцию в XAML. List<T> реализует IList интерфейс, поэтому он компилируется так, как вы ожидаете.

Если AdvisableCollection<T> орудия IList вы могли бы просто использовать IList что может быть нежелательно, потому что вы теряете строго типизированный интерфейс.

Если AdvisableCollection<T> реализует довольно универсальный тип коллекции, например System.Collections.Generic.List<T> или System.Collections.ObjectModel.Collection<T>, вы можете использовать эти типы для определения. Хотя это не так универсально, но все же довольно универсально, и эти типы имеют ограниченное количество дополнительных свойств и методов, которые позволяют переключаться междуIList<T> типы довольно простые и понятные.

Другой возможный вариант - реализовать класс-оболочку, наследующий как IList а также IList<T>интерфейсы. Это дает возможность работать с любым конкретным типом, который реализуетIList<T> имея строго типизированную коллекцию.

Другие вопросы по тегам