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が他の "魔法の"方法で動作するので、問題ではないかもしれないと思います。
ヒントやヒントがありがとうございます。
カスタムコントロールのすべてのインスタンスが同じビューにあり、したがって同じViewModelにバインドされています。しかし、それらはすべてViewModel上のプロパティ(BindingLists)を分離することに縛られているので、問題ではないはずです。 – haagel