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