【问题标题】:WPF ListBox always previous item selected on each change of selection?WPF ListBox 总是在每次选择更改时选择上一个项目?
【发布时间】: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)

请帮我解决这个问题,我将非常有义务。我有点卡在这里。

问候 乌斯曼

【问题讨论】:

    标签: c# wpf mvvm enums listbox


    【解决方案1】:

    你试图用 get set 做太多事情
    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;
    

    【讨论】:

    • 不,先生,这对我的问题没有任何影响。如果 USDAYieldGrade 不符合指定条件,我想返回它,否则它应该返回 NoGrade。这不是我的问题的问题
    • 但是如果它不符合那个条件那么它们是相等的,它与返回 this.CarcassDto.USDAYieldGrade;
    • 你错过了我的答案 - get 应该返回集合
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多