Заполнение коллекции в 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>
имея строго типизированную коллекцию.