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、コンストラクターでローカル値を設定しているためです。MSDN ではDependencyProperty、値の優先順位について詳しく説明しています

インスタンスごとにプロパティにデフォルト値を与えたいだけなので、コンストラクターSetCurrentValueの代わりに使用するだけSetValueです。

これをさらに説明するために編集

したがって、aDependencyPropertyは複数の方法で設定できます。コード、 a Binding、 a Style、 a Trigger、 an Animation、またはその他のいくつかの方法で設定できます。知っておくべき重要なことは、特定のプロパティを設定する試みが複数回行われる可能性があるということです。

このため、WPF では値の優先順位が定義されています。つまり、 でプロパティを設定するとStyle、そのプロパティを手動で設定してStyle値をオーバーライドできます。またはTrigger、値ControlTemplateをオーバーライドできますStyle

コンストラクターでプロパティを設定すると、ローカル値が与えられます。最初のリンクから、orのみがローカル値をオーバーライドできることがわかります。AnimationProperty Coercion

SetCurrentValueただし、このメソッドを使用すると、ローカル値を設定せずにプロパティの値を設定できます。で値を設定できるようにしたいので、これが必要ですStyle

于 2013-07-07T21:57:26.333 に答える
0

使用する代わりに( msdn )を使用List<ImageSource>する必要がありますCompositeCollection

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 に答える