0

我有一个名为 Switch 的 userControl,它有一个 List 类型的 DependancyProperty,名为 ImageList。在我的 ViewModel 中,我创建了一个名为 imgList 的 ObservableCollection。在我的 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); }
}

viewModel 是正确的,如下所示:

<ComboBox ItemsSource={Binding imgList}/>

有趣的是,这可以正常工作:

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

提前致谢!

4

1 回答 1

2

您如何期望类型 (imgList) 的传入值与ObservableCollection<>类型 (Switch.ImageList) 匹配List<>

请使您的类型兼容。

一种方法是重新声明类型为ImageListProperty实现接口。IList<>ObservableCollection<>IList

在 WPF 中,当目标属性的类型与源值的类型相同或基类型相同时,绑定会出错。ObservableCollection不是从List<>.

编辑

您的最后一个示例停止工作,因为IList<>在没有通过 XAML 提供给它的显式集合类型的情况下,没有隐式实例化(作为接口)。更改ImageListPropertyIList(不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

于 2013-06-06T09:45:51.290 回答