我正面临着关于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类型是代码中定义的枚举
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)
请帮助我解决这个问题,我会非常感激。我很善于被困在这里。
此致 乌斯曼
答案 0 :(得分:0)
你试图用get set做太多事 获取应返回
如果这是你的设置
this.CarcassDto.USDAYieldGrade = value;
然后这应该是你的
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;