Wpf Combobox等于方法不合逻辑的行为

时间:2014-06-18 14:04:15

标签: wpf combobox equals

我在这里有一些关于Combobox控制的学术问题。所以我有这个控件并且ComboboxItem类有哪些实例是组合框中的项目。我在Equals课程中覆盖了ComboboxItem方法,并尝试观察其中究竟发生了什么。我看到了意想不到的(我认为)行为。看。

代码隐藏:

[DebuggerDisplay("N = {Name}")]
public class ComboboxItem
{
    public Int32 Id { get; set; }
    public String Name { get; set; }

    // It is not very correctly written but it is not a problem
    public override bool Equals(object obj)
    {
        if (obj == null)
            return false;

        var cmb = obj as ComboboxItem;
        if (cmb == null)
            return false;

        if (Id.Equals(cmb.Id))
            return true;

        return false;
    }
}

public partial class MainWindow
{
    private ComboboxItem _selectedItem;
    private List<ComboboxItem> _source;

    public ComboboxItem SelectedItem
    {
        get { return _selectedItem; }
        set
        {
            _selectedItem = value; 
        }
    }

    public List<ComboboxItem> Source    
    {
        get { return _source; }
        set { _source = value; }
    }

    public MainWindow()
    {
        InitializeComponent();
        DataContext = this;

        _source = new List<ComboboxItem>
        {
            new ComboboxItem
            {
                Id = 1,
                Name = "Name11"
            },
            new ComboboxItem
            {
                Id = 2,
                Name = "Name22"
            },
            new ComboboxItem
            {
                Id = 3,
                Name = "Name33"
            },
        };

        // Name must be different from "Name33" for better observing
        _selectedItem = new ComboboxItem {Id = 3, Name = "AlmostName33"};
    }       
}

XAML:

  <ComboBox ItemsSource="{Binding Source}"
            DisplayMemberPath="Name"
            SelectedItem="{Binding SelectedItem, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}">
  </ComboBox>

你可以看到相当简单。它确实有效,即Name =“AlmostName33”的项目将在SelectedItem中设为Combobox


问题在于Equals方法及其调用的数量。我认为Equals只会被调用3(3!)次,以便将SelectedItemCombobox中的每个项目进行比较。但它确实会调用6(6!)次,而obj参数对我来说非常意外。详情:

1) 这=“Name11” obj =“Name11”----------这是什么?为什么不“AlmostName33”?

2) 这=“Name11” obj =“AlmostName33”

3) 这=“Name22” obj =“AlmostName33”

4) 这=“Name22” obj =“AlmostName33”

5) 这=“Name33” obj =“AlmostName33”

6) 这=“Name33” obj =“AlmostName33”

任何人都可以清楚地解释为什么我有六次调用以及为什么在第一次调用时obj =“Name11”?


更新

_source = new List<ComboboxItem>
{
    new ComboboxItem
    {
        Id = 1,
        Name = "Name11"
    },
    new ComboboxItem
    {
        Id = 2,
        Name = "Name22"
    }

};

var item = new ComboboxItem
{
    Id = 3,
    Name = "Name33"
},

_source.Add(item);
_selectedItem = item;

1 个答案:

答案 0 :(得分:1)

在测试代码后,我根本无法验证您的结果。我的结果部分符合预期,如下:

1)this =“Name11”obj =“Name11” - 这是因为最初选择了“Name11”。

2)this =“Name11”obj =“AlmostName33” - 这是因为正在选择“AlmostName33”。

3)this =“Name22”obj =“AlmostName33” - 这是因为正在选择“AlmostName33”。

4)this =“Name33”obj =“AlmostName33” - 这是因为正在选择“AlmostName33”。

5)this =“Name11”obj =“AlmostName33”

6)this =“Name22”obj =“AlmostName33”

7)this =“Name33”obj =“AlmostName33”

8)this =“Name11”obj =“AlmostName33”

9)this =“Name22”obj =“AlmostName33”

10)this =“Name33”obj =“AlmostName33”

所以基本上,对Equals方法的第一次调用是因为最初选择了"Name11"值...你可以通过在方法中放置断点然后单步调试代码来验证这一点。它来自方法并返回SelectedItem属性getter。

接下来的三个调用是预期的调用,其中Framework将潜在的选定值与集合中的每个项进行比较。然后出了点问题。我怀疑它与您没有正确实现Equals方法或者您正在尝试选择不在集合中的项目这一事实有关。