组合框显示绑定值但无法选择
Combobox is showing bound values but selection isn't possible
我对组合框有一些非常奇怪的行为。 Threre 是一个绑定到它的 ObservabalCollection。值显示正确。我可以向绑定到 combobox_PragmaSections 的集合添加一些值,它们会显示出来,我可以在它们之间切换。
有一些文本框和一个 DoubleUpDown,我可以在其中设置 combobox_PragmaSections 的 selected 项目的一些属性。
当我在文本框或 DoubleUpDown 中插入一些值时 combobox_PragmaSections "freezes"。它显示了包含的值,下拉是可能的,但是如果我尝试 select 另一个值而不是当前值,什么也不会发生。当我删除我的 isEqual 和 getHashCode 函数时,它起作用了……有人知道发生了什么吗?
<ComboBox x:Name="combobox_PragmaSections" ItemsSource="{Binding currentTask.list_PragmaSections}"
DisplayMemberPath="ViewName" Margin="13,271,10,0" VerticalAlignment="Top"
Grid.Column="1"/>
<TextBox Text="{Binding SelectedItem.Name,ElementName=combobox_PragmaSections}"
Height="23" Margin="13,298,10,0" TextWrapping="Wrap"
VerticalAlignment="Top" Grid.Column="1"/>
<TextBox Text="{Binding SelectedItem.FLAGS, ElementName=combobox_PragmaSections}" Height="23" Margin="13,324,10,0"
TextWrapping="Wrap" VerticalAlignment="Top" Grid.Column="1"/>
<xctk:DoubleUpDown Value="{Binding SelectedItem.Alignment,
ElementName=combobox_PragmaSections}" Margin="96,353,10,0"
VerticalAlignment="Top" Grid.Column="1" Height="20"/>
public override bool Equals(System.Object obj)
{
// If parameter is null return false.
if (obj == null)
{
return false;
}
// If parameter cannot be cast to Point return false.
Task_PragmaSection p = obj as Task_PragmaSection;
if ((System.Object)p == null)
{
return false;
}
bool isEqual = false;
// If parameter is null return false:
if ((object)p == null)
{
return false;
}
if (this.Unit == p.Unit &&
this.Size == p.Size &&
this.FLAGS == p.FLAGS &&
this.File_Path == p.File_Path &&
this.Description == p.Description &&
this.completeSection == p.completeSection &&
this.Alignment == p.Alignment &&
this.Name == p.Name &&
this.ViewName == p.ViewName &&
this.Type == p.Type &&
this.Qualifier == p.Qualifier &&
this.list_Objects == p.list_Objects)
{
isEqual = true;
}
// Return true if the fields match:
return isEqual;
}
public override int GetHashCode()
{
unchecked
{
int hash = 486187739;
if (this.Name!=null)
{
hash = hash * 23 + this.Name.GetHashCode();
}
if(this.ViewName!=null)
{
hash = hash * 23 + this.ViewName.GetHashCode();
}
if(this.Alignment!=null)
{
hash = hash * 23 + this.Alignment.GetHashCode();
}
return hash;
}
}
您的 GetHashCode() 看起来不正确,因为您实现的值 returns 将在对象的生命周期内发生变化(一旦分配了名称、视图名称或对齐方式)。这意味着实例可能会在字典或哈希集中丢失。如果您不必将对象作为字典中的键(而且您几乎总能找到替代方法),则不应重写 GetHashCode()。
我对组合框有一些非常奇怪的行为。 Threre 是一个绑定到它的 ObservabalCollection。值显示正确。我可以向绑定到 combobox_PragmaSections 的集合添加一些值,它们会显示出来,我可以在它们之间切换。
有一些文本框和一个 DoubleUpDown,我可以在其中设置 combobox_PragmaSections 的 selected 项目的一些属性。
当我在文本框或 DoubleUpDown 中插入一些值时 combobox_PragmaSections "freezes"。它显示了包含的值,下拉是可能的,但是如果我尝试 select 另一个值而不是当前值,什么也不会发生。当我删除我的 isEqual 和 getHashCode 函数时,它起作用了……有人知道发生了什么吗?
<ComboBox x:Name="combobox_PragmaSections" ItemsSource="{Binding currentTask.list_PragmaSections}"
DisplayMemberPath="ViewName" Margin="13,271,10,0" VerticalAlignment="Top"
Grid.Column="1"/>
<TextBox Text="{Binding SelectedItem.Name,ElementName=combobox_PragmaSections}"
Height="23" Margin="13,298,10,0" TextWrapping="Wrap"
VerticalAlignment="Top" Grid.Column="1"/>
<TextBox Text="{Binding SelectedItem.FLAGS, ElementName=combobox_PragmaSections}" Height="23" Margin="13,324,10,0"
TextWrapping="Wrap" VerticalAlignment="Top" Grid.Column="1"/>
<xctk:DoubleUpDown Value="{Binding SelectedItem.Alignment,
ElementName=combobox_PragmaSections}" Margin="96,353,10,0"
VerticalAlignment="Top" Grid.Column="1" Height="20"/>
public override bool Equals(System.Object obj)
{
// If parameter is null return false.
if (obj == null)
{
return false;
}
// If parameter cannot be cast to Point return false.
Task_PragmaSection p = obj as Task_PragmaSection;
if ((System.Object)p == null)
{
return false;
}
bool isEqual = false;
// If parameter is null return false:
if ((object)p == null)
{
return false;
}
if (this.Unit == p.Unit &&
this.Size == p.Size &&
this.FLAGS == p.FLAGS &&
this.File_Path == p.File_Path &&
this.Description == p.Description &&
this.completeSection == p.completeSection &&
this.Alignment == p.Alignment &&
this.Name == p.Name &&
this.ViewName == p.ViewName &&
this.Type == p.Type &&
this.Qualifier == p.Qualifier &&
this.list_Objects == p.list_Objects)
{
isEqual = true;
}
// Return true if the fields match:
return isEqual;
}
public override int GetHashCode()
{
unchecked
{
int hash = 486187739;
if (this.Name!=null)
{
hash = hash * 23 + this.Name.GetHashCode();
}
if(this.ViewName!=null)
{
hash = hash * 23 + this.ViewName.GetHashCode();
}
if(this.Alignment!=null)
{
hash = hash * 23 + this.Alignment.GetHashCode();
}
return hash;
}
}
您的 GetHashCode() 看起来不正确,因为您实现的值 returns 将在对象的生命周期内发生变化(一旦分配了名称、视图名称或对齐方式)。这意味着实例可能会在字典或哈希集中丢失。如果您不必将对象作为字典中的键(而且您几乎总能找到替代方法),则不应重写 GetHashCode()。