WPF ListBox总是在每次更改选择时选择上一个项目?

时间:2014-07-16 15:17:28

标签: c# wpf mvvm enums listbox

我正面临着关于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)

请帮助我解决这个问题,我会非常感激。我很善于被困在这里。

此致 乌斯曼

1 个答案:

答案 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;