WPF列表框总是在每次选择更改时选中前一项
本文关键字:一项 列表 选择 WPF | 更新日期: 2023-09-27 18:13:16
我正面临一个关于WPF ListBox的奇怪问题。我已经尝试了设置ListBox绑定的所有变化,但它仍然是相同的。
只要我改变选择并点击不同的项目,而不是已经选择的项目,它就会跳转回之前选择的项目。在第二次点击,它被选中之后,这是完全错误的。我调试了一下,发现一切正常。在调用RaisePropertyChange(Property)之后,它跳转到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类型是在代码
中定义的Enumpublic 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)
请帮我解决这个问题,我将不胜感激。我有点被困在这里了。
的问候乌斯曼
get set做的太多了
get应该返回集合
如果这是你的集合
this.CarcassDto.USDAYieldGrade = value;
那么这应该是你的get
return this.CarcassDto.USDAYieldGrade;
你不应该在get
中修改this.CarcassDto.USDAYieldGrade这只是奇怪的
if (this.CarcassDto.USDAYieldGrade != YieldGrade.NoGrade)
return this.CarcassDto.USDAYieldGrade;
return YieldGrade.NoGrade;
与
相同if (this.CarcassDto.USDAYieldGrade == YieldGrade.NoGrade)
{
return YieldGrade.NoGrade;
}
else
{
return this.CarcassDto.USDAYieldGrade;
}
与
相同if (this.CarcassDto.USDAYieldGrade == YieldGrade.NoGrade)
{
return this.CarcassDto.USDAYieldGrade;
}
else
{
return this.CarcassDto.USDAYieldGrade;
}
与
相同return this.CarcassDto.USDAYieldGrade;