【发布时间】:2014-07-16 15:17:28
【问题描述】:
我遇到了关于 WPF ListBox 的奇怪问题。我已经尝试了设置 ListBox 绑定的所有变体,但还是一样。
只要我更改选择并单击已选择的项目以外的其他项目,它就会跳回到上一个选定的项目。在第二次单击时,它会被选中,这是完全错误的。 我调试了一下,发现一切正常。调用 RaisePropertyChange(Property) 后,它会跳转到属性的 getter 部分,那里的一切也都很好。它从那里返回有效值。
但是在返回之后并且在再次显示选定的值之前,发生了一些不好的事情,因此,它会跳回到之前选择的项目(anchorItem)。
以下是用于此的 XAML。
<ListBox x:Name="yGradesListBox"
Style="{StaticResource enumListBox}"
SectedValue="{Binding Path=SelectedYieldGrade}"/>
虽然绑定属性是:
public YieldGrade SelectedYieldGrade
{
get
{
if (_sides[0].YieldGradeState == SelectionState.Selected)
return YieldGradeConverter.Convert(_sides[0].YieldGrade);
if (_sides[1].YieldGradeState == SelectionState.Selected)
return YieldGradeConverter.Convert(_sides[1].YieldGrade);
//this is the condition that meets after RaisePropertyChange and it has to be returned.
if (this.CarcassDto.USDAYieldGrade != YieldGrade.NoGrade)
return this.CarcassDto.USDAYieldGrade;
return YieldGrade.NoGrade;
}
set
{
if (this.CarcassDto.USDAYieldGrade == YieldGrade.NoGrade || this.CarcassDto.USDAYieldGrade != value)
{
this.CarcassDto.USDAYieldGrade = value;
foreach (SideViewModel sideData in _sides.Where(sideData => sideData.HasData))
{
sideData.YieldGradeState = SelectionState.Overwritten;
}
this.CarcassDto.YieldGradeOverrideState = this.GetYieldGradeOverride();
RaisePropertyChanged("SelectedYieldGrade");
_model.OnCarcassDataChanged(this, new CarcassDataChangedEventArgs() { RecalcProgram = true });
}
}
}
并且YieldGrade类型是代码中定义的Enum
public enum YieldGrade
{
[Description("No Grade")]
NoGrade = 0,
[Description("Y1")]
YG1 = 1,
[Description("Y2")]
YG2 = 2,
[Description("Y3")]
YG3 = 3,
[Description("Y4")]
YG4 = 4,
[Description("Y5")]
YG5 = 5
}
现在,如果我单击上面枚举表示的任何项目,选择将跳回锚值(即先前选择的)。 我已经在标记中应用了所有属性组合(例如 TwoWay、SelectedItem)
请帮我解决这个问题,我将非常有义务。我有点卡在这里。
问候 乌斯曼
【问题讨论】: