我有一个类封装了许多集合。我希望将此类绑定到列表框以显示集合中的项。类实现IEnumerable。当显示列表框时,我希望调用IEnumerable.GetEnumerator方法。但是,当getEnumerator方法使用yield关键字时,情况并非如此。但是,如果我从列表集合中返回枚举器,它将正常工作,那么每次显示窗口时都会调用getEnumerator方法。
列表集合的枚举器有什么神奇之处????
允许wpf itemscontrol获取快照(不需要更新)的正确接口是什么????我是要用的那个吗????
下面的示例代码在每次打开新窗口时添加时间戳。但是,列表框从不显示多个时间戳,它是第一个(也是唯一一个)调用getEnumerator时的时间戳数。计数增加,因此添加时间戳。更改GetEnumerator方法以返回列表集合的枚举器将导致每次打开新窗口时调用GetEnumerator方法。
XAML:
<Window x:Class="YieldTest.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Height="300" Width="300">
<StackPanel>
<Button Content="Open" Click="Button_Click" />
<TextBlock Text="{Binding Path=Count}" />
<ListBox ItemsSource="{Binding}" />
</StackPanel>
</Window>
代码落后:
using System;
using System.Collections;
using System.Collections.Generic;
using System.Diagnostics;
using System.Windows;
namespace YieldTest
{
public partial class Window1 : Window
{
public Window1()
{
InitializeComponent();
}
private void Button_Click(object sender, RoutedEventArgs e)
{
Window1 window1 = new Window1();
window1.DataContext = _timeStamps;
_timeStamps.Add(DateTime.Now);
window1.Show();
}
private static TimeStamps _timeStamps = new TimeStamps();
}
public class TimeStamps : IEnumerable
{
public void Add(DateTime time1)
{
_timeStamps.Add(time1);
}
public int Count { get { return _timeStamps.Count; } }
public IEnumerator GetEnumerator()
{
Debug.WriteLine("GetEnumerator");
foreach (DateTime timeStamp in _timeStamps)
{
yield return timeStamp;
}
}
private List<DateTime> _timeStamps = new List<DateTime>();
}
}