WPFのデータバインディングに問題があります。問題が非常に微妙であることが懸念されるため、私の説明では明確になることを願っています。WPFデータバインディング:項目の変更はどのように検出されますか?
私は本質的に、それぞれが相互に連結された複数のComboBoxを持つWPF UserControlを持っています。つまり、最初のコンボボックスにはいくつかの要素があり、ユーザーが選択して項目を選択すると、2番目のコンボボックスは前の選択に基づいた要素で満たされます。 すべてのコンボボックスは、UpdateSourceTrigger = LostFocusとバインドされています。
コンボのItemsSourceプロパティのコードは次のようになります。
private ICollectionView allTicketTypesView;
public IEnumerable<TicketTypeBase> AllTicketTypes
{
get { return this.allTicketTypesView.SourceCollection.Cast<TicketTypeBase>(); }
private set
{
IEnumerable<TicketTypeBase> enumerable = value ?? new TicketTypeBase[0];
ObservableCollection<TicketTypeBase> source = new ObservableCollection<TicketTypeBase>(enumerable);
this.allTicketTypesView = CollectionViewSource.GetDefaultView(source);
this.OnPropertyChanged("AllTicketTypes");
}
}
コンボのSelectedItemプロパティのコードは、このコードのようになります。
private TicketTypeBase ticketType;
public TicketTypeBase TicketType
{
get { return this.ticketType; }
set
{
this.ticketType = value;
this.OnPropertyChanged("TicketType");
this.UpdateConcessions();
}
}
私が経験しています微妙な問題: キーボードやマウスでコンボを動かすと、実際にはリストの項目を変更しないとpropertychangedが呼び出されることがよくあります。 私は、コンボが要素で満たされ、項目が選択されていることを意味します。キーボードでコンボを移動すると、propertychangedがトリガーされます(他のコンボが更新されます。同じ。 文字列のリスト(これはEquals/GetHashCode実装でエラーがないと仮定します)にバインドされたコンボボックスでこの動作が確認され、この動作は初めての場合を除き毎回発生します。
私はこれでコード修正しました:
private string category;
public string Category
{
get { return this.category; }
set
{
bool actuallyChanged = !String.Equals(this.category, value);
this.category = value;
this.OnPropertyChanged("Category");
if (!actuallyChanged)
{
string format = String.Format("Category '{0}' isn't changed actually", value);
Trace.WriteLine(format);
}
else this.UpdateTicketTypes():
}
}
をしかし、もちろん、私はセッターにロジックを追加し、このコードを好きではありません。
この現象を回避する方法についてのご意見はありますか? 私は明確になることを望み、誰かがはっきり理解できない場合、私は自分の問題をより良く説明する準備ができています。
返答ありがとうございます:しかし、初めてこの動作が起こると毎回私は狂気になります:-) –