我正在尝试在WPF中创建CustomUserControl。
此CustomUserControl包含类型为ObservableCollection的DependencyProperty。

我的目标是能够:


能够直接在xaml代码中设置集合
能够将集合绑定到我的ViewModel中的集合
能够使用样式设置器设置集合
每个CustomUserControl实例都有一个不同的集合实例。


这是我现在拥有的:

<my:CustomUserControl ImageList={Binding imgList}/>


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


为了每个CustomUserControl都有一个ImageList的新实例,我在CustomUserControl的ctor中添加了以下几行:

public CustomUserControl(){
...
SetValue(ImageListProperty, new List<ImageSource>());
}


现在,以下代码示例可以工作:

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


这也有效:

<my:CustomUserControl ImageList={Binding imgList}/>


但这不是:

<Style TargetType="my:CustomUserControl">
<Setter Property="my:CustomUserControl.ImageList">
        <BitmapImage UriSource="Bla.png"/>
        <BitmapImage UriSource="Bla2.png"/>
</Setter>
</Style>


这将使所有实例都具有一个空的ImageList。

附言这是伪代码,因为我不记得确切的语法。

谢谢!

最佳答案

之所以无法在Style中设置值,是因为您正在构造函数中设置本地值。 MSDN explains DependencyProperty value precedence in more detail

因为只想为每个实例赋予属性默认值,所以只需在构造函数中使用SetCurrentValue而不是SetValue即可。

编辑以进一步解释

因此,可以采用多种方式设置DependencyProperty。可以通过代码,BindingStyleTriggerAnimation或其他几种方式进行设置。要知道的重要一点是,可以多次尝试设置给定的属性。

因此,WPF已为值定义了优先级。这意味着,如果您在Style中设置属性,则可以手动设置该属性以覆盖Style值。或者Trigger中的ControlTemplate可以覆盖Style值。

在构造函数中设置属性时,将为其赋予局部值。从第一个链接,您将看到只有AnimationProperty Coercion可以覆盖本地值。

但是,SetCurrentValue方法将允许您为属性without setting a local value设置值。这就是您需要的,因为您希望能够在Style中设置值。

10-07 19:39