Заполнение свойства типа ObservableCollection в XAML статическими ресурсами
Я создал класс, который содержит свойство типа ObservableCollection. Я пытаюсь создать экземпляр класса в XAML и заполнить это свойство членами. Я продолжаю получать исключение, что класс T не может быть преобразован в ObservableCollection, но это исключение возникает, только когда я пытаюсь заполнить список элементами, которые были объявлены как статические ресурсы.
У кого-нибудь есть идея, почему?
Код выглядит следующим образом:
<ResourceDictionary
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:mseg="clr-namespace:SegApp.Model.DataEntities.Segments;assembly=SegApp.Model.Silverlight">
<mseg:Dot xKey="d1"/>
<mseg:Dot xKey="d2"/>
<mseg:Dot xKey="d3"/>
<mseg:Dot xKey="d4"/>
<mseg:Segment xKey="seg1">
<mseg:Segment.Dots>
<StaticResource ResourceKey="d1"/>
<StaticResource ResourceKey="d2"/>
<StaticResource ResourceKey="d3"/>
<StaticResource ResourceKey="d4"/>
</mseg:Segment.Dots>
</mseg:Segment>
</ResourceDictionary>
Определение класса:
public class Segment : Part
{
public ObservableCollection<Dot> Dots { get; set; }
public Segment()
{
Dots = new ObservableCollection<Dot>();
}
}
И исключение говорит:
Объект типа bla.bla.bla.Dot нельзя преобразовать в тип System.Collections.ObjectModel.ObservableCollection'1 [bla.bla.bla.Dot]
"
Есть идеи?
2 ответа
Чтобы использовать синтаксис XAML коллекций, измените свое свойство и удалите его установщик:
public class Segment : DependencyObject
{
private readonly ObservableCollection<Dot> _dots = new ObservableCollection<Dot>();
public ObservableCollection<Dot> Dots
{
get { return _dots; }
}
}
Как и в вашем коде, каждый элемент коллекции должен быть точкой, а не ресурсом... Каждая запись списка в вашем коде xaml должна быть чем-то похожей или, возможно, попробовать somevalue или {staticResource xxx }
Но есть еще проблема. Первый синтаксис в порядке, второй может работать, если есть простой контент для Dot, но третий не может работать: тег означает "создать экземпляр Dot". И StaticResource означает "создать экземпляр.. и дать ему ключ". Так что последний синтаксис определенно не будет работать, потому что вы можете заменить экземпляр, созданный тегом, на экземпляр, поступающий из ресурса...
Но попробуйте. Основная проблема в вашем коде заключается в том, что вы пытаетесь почувствовать коллекцию Dot с Resource, которая не может работать, а компилятор не в порядке.. попробуйте использовать тег для создания записи. А затем поиграйте немного, чтобы увидеть, можете ли вы ссылаться на ресурсы где-нибудь в этих тегах