gpt4 book ai didi

Wpf Combobox Equals 方法不合逻辑的行为

转载 作者:行者123 更新时间:2023-12-04 18:28:45 25 4
gpt4 key购买 nike

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

代码隐藏:

[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"的项目将在 Combobox 中设置为 SelectedItem


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

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

2)这 = “姓名 11”obj = "AlmostName33"

3)这 = “姓名 22”obj = "AlmostName33"

4)这 = “姓名 22”obj = "AlmostName33"

5)这 = “姓名 33”obj = "AlmostName33"

6)这 = “姓名 33”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 属性 getter。

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

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com