我正在尝试在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
。可以通过代码,Binding
,Style
,Trigger
,Animation
或其他几种方式进行设置。要知道的重要一点是,可以多次尝试设置给定的属性。
因此,WPF已为值定义了优先级。这意味着,如果您在Style
中设置属性,则可以手动设置该属性以覆盖Style
值。或者Trigger
中的ControlTemplate
可以覆盖Style
值。
在构造函数中设置属性时,将为其赋予局部值。从第一个链接,您将看到只有Animation
或Property Coercion
可以覆盖本地值。
但是,SetCurrentValue
方法将允许您为属性without setting a local value设置值。这就是您需要的,因为您希望能够在Style
中设置值。