2013-06-06 4 views
0

У меня есть userControl named Switch, у которого есть DependancyProperty типа List с именем ImageList. В моей модели ViewModel я создаю ObservableCollection с именем imgList. В Моем окне XAML, я пишу следующую строку:Не удается привязать ObservableCollection к списку dp из xaml

<loc:switch ImageList={Binding imgList}/> 

К моему большому сожалению, это не работает на всех и ImageList не получает запрашиваемые значения.

ImageList определяется следующим образом:

public static readonly DependancyProperty ImageListProperty = DependancyProperty.Register 
    ("ImageList", typeof(List<ImageSource>), typeof(Switch)); 

public List<ImageSource> ImageList { 
    get { return (List<ImageSource>)GetValue(ImageListProperty); } 
    set { SetValue(ImageListProperty, value); } 
} 

модели представления является правильным, так как следующие работы:

<ComboBox ItemsSource={Binding imgList}/> 

Интересно отметить, что это работает правильно:

<loc:switch> 
    <loc:switch.ImageList> 
    <BitmapImage UriSource="Bla.png"/> 
    <BitmapImage UriSource="Bla2.png"/> 
    </loc:switch.ImageList> 
</loc:switch> 

Заранее спасибо!

+1

показать привязку в вашем usercontrol и свой код свойства зависимостей – blindmeis

+0

@blindmeis: просто добавлено, спасибо – Maya

+0

@DHN: Почему это имеет какое-либо значение? Важным моментом является то, что ImageList остается неизменным и не получает набор, определенный в VM – Maya

ответ

2

Как вы ожидаете, что входящее значение ObservableCollection<> (imgList) будет соответствовать типу List<> (Switch.ImageList)?

Пожалуйста, совместите ваши типы.

Один из способов заключается в повторном использовании ImageListProperty до IList<> типа ObservableCollection<> осуществляет IList интерфейс.

В WPF Связывание будет иметь вид, если тип свойства цели тот же или базовый тип для значения источника. ObservableCollection не происходит от List<>.

EDIT

Ваш последний пример перестает работать, потому что IList<> разве инстанцирован неявно (будучи Interface) без явного типа коллекции, подаваемого в него через XAML. Поменять ImageListProperty на IList (Не IList<T>).

Вы должны это изменить этот путь ....

<loc:switch xmlns:coll="clr-namespace:System.Collections;assembly=mscorlib"> 
    <loc:switch.ImageList> 
    <coll:ArrayList> 
     <BitmapImage UriSource="Bla.png"/> 
     <BitmapImage UriSource="Bla2.png"/> 
    </coll:ArrayList> 
    </loc:switch.ImageList> 
</loc:switch> 

Это работает, потому что ArrayList является конкретным XAML сериализовать коллекция, которая реализует IList. И ObservableCollection<> также не имеет равных IList.

+0

Это звучит неплохо. Проблема в том, что пример, который я привел до прекращения работы: Ошибка, которую я получаю, заключается в том, что IList может получить только одного ребенка – Maya

+0

См. мое редактирование выше. –

+0

Большое спасибо, ты мой спаситель! – Maya