3

我正在尝试在 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。

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

谢谢!

4

2 回答 2

1

您无法在 a 中设置值的Style原因是因为您在构造函数中设置了本地值。MSDNDependencyProperty更详细地解释了值优先级

因为您只想为每个实例的属性提供一个默认值,所以只需在构造函数中使用SetCurrentValue而不是。SetValue

编辑以进一步解释这一点

因此,aDependencyProperty可以通过多种方式设置。它可以通过代码、a Binding、a Style、a Trigger、anAnimation或其他几种方式设置。要知道的重要一点是,可以多次尝试设置给定的属性。

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

当你在构造函数中设置属性时,你给它一个本地值。从第一个链接中,您将看到只有AnimationorProperty Coercion可以覆盖本地值。

SetCurrentValue但是,该方法将允许您在不设置本地值的情况下为属性设置值。这就是您所需要的,因为您希望能够在 a 中设置值Style

于 2013-07-07T21:57:26.333 回答
0

而不是使用List<ImageSource>你应该使用CompositeCollectionmsdn

public CompositeCollection ImageList
{
    get { return (CompositeCollection)GetValue(ImageListProperty); }
    set { SetValue(ImageListProperty, value); }
}      
public static readonly DependencyProperty ImageListProperty =
    DependencyProperty.Register("ImageList", typeof(CompositeCollection), typeof(CustomUserControl), new PropertyMetadata(new CompositeCollection()));

现在您可以像这样以定义的样式设置值:

<my:CustomUserControl x:Name="myCustomUserControl   
    <my:CustomUserControl.Style>
        <Style TargetType="{x:Type my:CustomUserControl}">
            <Setter Property="my:CustomUserControl.ImageList">
                <Setter.Value>
                    <CompositeCollection>
                        <BitmapImage UriSource="Bla.png"/>
                        <BitmapImage UriSource="Bla2.png"/>
                    </CompositeCollection>
                </Setter.Value>
            </Setter>
        </Style>
    </my:CustomUserControl.Style>            
</my:CustomUserControl>

其他绑定的工作方式与您在问题中提出的方式相同。

例如:

<my:CustomUserControl x:Name="myCustomUserControl">
    <my:CustomUserControl.ImageList>
        <BitmapImage UriSource="Bla.png" />
        <BitmapImage UriSource="Bla2.png" />
    </my:CustomUserControl.ImageList>            
</my:CustomUserControl>
于 2013-07-07T21:03:46.817 回答