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类型是在代码

中定义的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)

请帮我解决这个问题,我将不胜感激。我有点被困在这里了。

的问候乌斯曼

WPF列表框总是在每次选择更改时选中前一项

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;