我在这里有一些关于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次(三!)次,以将SelectedItemCombobox中的每个项目进行比较。但是它确实调用了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)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属性获取器。

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

关于wpf - WPF Combobox等于方法不合逻辑的行为,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/24287701/

10-10 18:39