【发布时间】:2011-08-01 08:16:25
【问题描述】:
我对 WPF 数据绑定有一些问题,我希望在我的解释中清楚,因为我担心这个问题非常微妙。
我基本上有一个带有一堆 ComboBox 的 WPF UserControl,每个 ComboBox 都相互链接。我的意思是第一个组合框填充了一些元素,当用户选择和项目时,第二个组合框根据之前的选择填充元素,以此类推其他组合框。 所有组合框都与 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。 我的意思是一个组合填充了元素,并选择了一个项目:使用键盘移动组合触发属性更改(并让另一个组合被更新,这是一种不合时宜的行为),但元素本身是相同的. 我在与字符串列表绑定的组合框中看到了这种行为(所以我认为 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():
}
}
但我当然不喜欢这种为设置器添加逻辑的代码。
关于如何避免这种行为的任何建议? 我希望清楚,如果有人不清楚,我准备更好地解释我的问题。
【问题讨论】:
标签: wpf data-binding