如何解决列表框没有显示我的第一项
| 我在WPF上遇到了一个小问题,并将我的列表框/列表视图绑定到了自定义列表。 此列表已实现IEnumerator和IEnumerable接口。如果将控件绑定到这些控件,则永远看不到该列表的第一个对象。 当我使用gridview时,它确实显示了我的第一个对象。因此出于某种原因,列表框/列表视图正在做不同的事情来枚举我的自定义列表。 我的绑定是使用ViewModel上的public属性以完全相同的方式进行设置的。 Binding(My PersonObject有一个公共属性ProjectList,它获取我正在谈论的自定义列表)。 public Person Person
{
get
{
return this._person;
}
set
{
if (this._person != value)
{
this._person = value;
RaisePropertyChanged(\"Person\");
}
}
}
XAML:
<ListBox ItemsSource=\"{Binding Path=Person.ProjectList,UpdateSourceTrigger=PropertyChanged}\" AlternationCount=\"2\" ItemContainerStyle=\"{StaticResource CustomListBoxItemStyle}\">
<ListBox.ItemTemplate>
<DataTemplate>
<StackPanel>
<TextBlock>
<TextBlock.Text>
<MultiBinding StringFormat=\"{}{0} - {1}\">
<Binding Path=\"Name\" />
<Binding Path=\"Number\" />
</MultiBinding>
</TextBlock.Text>
</TextBlock>
<TextBlock>
<TextBlock.Text>
<MultiBinding StringFormat=\"{}{0} - {1}\">
<Binding Path=\"StartDate\" />
<Binding Path=\"EndDate\" />
</MultiBinding>
</TextBlock.Text>
</TextBlock>
</StackPanel>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
Customlist类:
public class ProjectList : DeletableSupport,IEnumerator,IEnumerable
{
private IList<Project> _pList;
private int _position;
public ProjectList()
{
this._pList = new ActivatableList<Project>();
this._position = -1;
}
public void Add(Project p)
{
Activate(ActivationPurpose.Write);
this._pList.Add(p);
}
public void Remove(Project p)
{
Activate(ActivationPurpose.Write);
this._pList.Remove(p);
}
public int Count()
{
Activate(ActivationPurpose.Read);
return this._pList.Count();
}
public bool Contains(Project p)
{
Activate(ActivationPurpose.Read);
return this._pList.Contains(p);
}
public Project this[int i]
{
get
{
Activate(ActivationPurpose.Read);
return this._pList[i];
}
set
{
Activate(ActivationPurpose.Write);
this._pList[i] = value;
}
}
public static ProjectList operator +(ProjectList pList,Project p)
{
pList.Add(p);
return pList;
}
public static ProjectList operator -(ProjectList pList,Project p)
{
pList.Remove(p);
return pList;
}
#region IEnumerable Members
public IEnumerator GetEnumerator()
{
Activate(ActivationPurpose.Read);
return (IEnumerator)this;
}
#endregion
#region IEnumerator Members
public object Current
{
get
{
try
{
Activate(ActivationPurpose.Read);
return this._pList[_position];
}
catch (IndexOutOfRangeException)
{
throw new InvalidOperationException();
}
}
}
public bool MoveNext()
{
Activate(ActivationPurpose.Read);
this._position++;
if (_position < this._pList.Count)
{
return true;
}
else
{
return false;
}
}
public void Reset()
{
Activate(ActivationPurpose.Write);
_position = -1;
}
#endregion
}
Activate来自db4o,ActivatableList实现IList
解决方法
我要在这里冒险,只是为了测试我的心理调试技能:)
ListBox / ListView使用IEnumerable.Any()(或某些等效项)来测试列表是否为空。返回的是true,因此它随后使用IEnumerable实现实际遍历列表。
请注意,它尚未在您的类上调用reset,这意味着将跳过通过Any()调用检索的第一个元素。
通常,在IEnumerable上调用GetEnumerator会为您的类返回IEnumerator的新实例,但是您的实际列表实现包含枚举器的所有状态。您是否考虑过如果第二次将此列表传递给ListBox会发生什么情况?我认为您什么都看不到。
好吧,那怎么解决呢?好吧,给定您拥有的代码,只要有人调用GetEnumerator(),您就可以调用Reset()。但是,您拥有的实现不是线程安全的(现在可能不是问题,但是谁知道将来将如何使用它?)。如果您真的不想使用ObservableCollection之类的东西来存储项目列表,那么我至少要看看从GetEnumerator方法返回一个单独的IEnumerator实例,并将枚举过程的所有状态都保存在那里。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。