Cannot bind ObservableCollection to List dp from xaml

点点圈 提交于 2019-12-11 20:38:00

问题


I have a userControl named Switch which has a DependancyProperty of type List, named ImageList. In my ViewModel, I create a ObservableCollection named imgList. In My XAML window, I write the following line:

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

To my greatest regret, this does not work at all and ImageList does not recieve the requested values.

ImageList is defined as the following:

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); }
}

The viewModel is correct, as the following works:

<ComboBox ItemsSource={Binding imgList}/>

It is interesting to note that this works correctly:

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

Thanks in advance!


回答1:


How do you expect an incoming value of ObservableCollection<> type (imgList) would match with List<> type (Switch.ImageList)?

Please make your types compatible.

One way is to redeclare ImageListProperty to IList<> type as ObservableCollection<> implements IList interface.

In WPF Binding would wouk when the target property's type is same or a base type to the source value. ObservableCollection doesnt derive from List<>.

EDIT

Your last example stops working because IList<> isnt instantiated implicitly (being an Interface) without explicit collection type supplied to it via XAML. Change ImageListProperty to IList (Not IList<T>).

You should it change this way....

 <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>

This works because ArrayList is a concrete XAML serialized collection that implements IList. And ObservableCollection<> also does plain IList.



来源:https://stackoverflow.com/questions/16958476/cannot-bind-observablecollection-to-list-dp-from-xaml

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!