2011-01-27 4 views
1

ListBoxから継承するWPFでカスタムコントロールを構築しました。これで私はBindingListである自分のプロパティをimplementet持っている。私がしたDependencyPropertyとしてそれをimplemenetedました。このプロパティのバインド可能にするには:WPF:コントロールのいくつかのインスタンスを使用すると、カスタムコントロールのDependencyPropertyが失敗する

public BindingList<CheckableListItem> CheckedItems 
{ 
    get 
    { 
     return (BindingList<CheckableListItem>)GetValue(MultiComboBox.CheckedItemsProperty); 
    } 
    set 
    { 
     SetValue(MultiComboBox.CheckedItemsProperty, value); 
    } 
} 
public static readonly DependencyProperty CheckedItemsProperty; 

を私は私のカスタムコントロール内の静的コンストラクタで、このしたDependencyPropertyを登録します。

CheckedItemsProperty = DependencyProperty.Register("CheckedItems", 
    typeof(BindingList<CheckableListItem>), 
    typeof(MultiComboBox), 
    new FrameworkPropertyMetadata(new BindingList<CheckableListItem>())); 

(MultiComboBoxは私のカスタムコントロールの名前です。 CheckableListItemは、この目的のためだけに書いたシンプルなクラスです)。

このBindingListは、ユーザーが対話するときにカスタムコントロール(外部にはない)内で更新されます。

私はカスタムコントロールをXAMLで使用すると、 "OneWayToSource"モードでCheckItemsプロパティにバインドします。私はMVVMパターンを使用しています。私がバインドするViewModelのプロパティもBindingListです。 ViewModelはこのリストには影響しません。カスタムコントロールがリストに加えた変更に反応します。あなたは、私が(これらの変更は、常に私のカスタムコントロールの内部で発生する)のリストに加えられた変更を聞いて、「SelectedItemsChanged」-method Iによ見ることができるように

private BindingList<CheckableListItem> _selectedItems; 
public BindingList<CheckableListItem> SelectedItems 
{ 
    get 
    { 
     return _selectedItems; 
    } 
    set 
    { 
     if (value != _selectedItems) 
     { 
      if (_selectedItems != null) 
      { 
       _selectedItems.ListChanged -= SelectedItemsChanged; 
      } 
      _selectedItems = value; 
      if (_selectedItems != null) 
      { 
       _selectedItems.ListChanged += SelectedItemsChanged; 
      } 
      OnPropertyChanged("SelectedItems"); 
     } 
    } 
} 

:ViewModelに内のプロパティは、次のようになりますそれに従って私のモデルを更新してください。

これは、私のビューにこれらのコントロールの1つがあるときにうまくいきます。しかし、同じビューに2つ(またはそれ以上)のものを置くと、奇妙なことが起こり始める。もちろんこれは、私がViewModelで選択した項目を持つ2つのリストを持つことを意味します。しかし、ビューの中で何かを実行してリストの1つを変更すると、両方のリストが影響を受けます。つまり、ListChangedイベントのイベントハンドラは、いずれかのイベントに変更が加えられた場合、両方のリストに対してトリガされます。

誰でもこの問題を認識しているか、解決策がありますか?実装で何が問題になっていますか?

私の最初のことは、DependencyPropertyが静的であることです。通常、これはすべてのインスタンス間で共有されることを意味します。しかし、私はDependencyPropertiesが他の "魔法の"方法で動作するので、問題ではないかもしれないと思います。

ヒントやヒントがありがとうございます。

答えて

0

これは両方の/すべてのビューを同じViewModelにバインドしたようです。それは、一方の原因の変化が他方の原因で変化することを説明する。

+0

カスタムコントロールのすべてのインスタンスが同じビューにあり、したがって同じViewModelにバインドされています。しかし、それらはすべてViewModel上のプロパティ(BindingLists)を分離することに縛られているので、問題ではないはずです。 – haagel

2

私はコレクション型の依存関係プロパティで同様の問題がありました。私の解決策は、Collection-Type Dependency PropertiesのMSDN記事から取りました。コレクション型依存関係プロパティのコンストラクタは一度だけに関係なく、このコレクションを含む、あなたのコントロールが持っているどのように多くのインスタンスと呼ばされていないようですので、それは私のコントロールのコンストラクタに次の行

SetValue(OperatorsPropertyKey, new List<ListBoxItem>()); //replace key and type 

を追加して(静的EH) 。

関連する問題