gpt4 book ai didi

.net - 创建具有 ObservableCollection 类型的 DependencyProperty 的 CustomUserControl

转载 作者:行者123 更新时间:2023-12-02 13:26:46 25 4
gpt4 key购买 nike

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

我的目标是能够:

  • 能够直接在xaml代码中设置集合
  • 能够将集合绑定(bind)到我的 ViewModel 中的集合
  • 能够使用样式 setter 设置集合
  • 每个 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 的构造函数中添加了以下行:

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 值。或者 ControlTemplate 中的 Trigger 可以覆盖 Style 值。

当您在构造函数中设置属性时,您将为其指定一个本地值。从第一个链接中,您将看到只有动画属性强制可以覆盖本地值。

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

关于.net - 创建具有 ObservableCollection 类型的 DependencyProperty 的 CustomUserControl,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17515611/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com