我正在尝试用IHistoryItem对象填充ListView。由于历史应该适用于LIFO,我决定使用Stack<T>
作为我的收藏:
private readonly Stack<IHistoryItem> history = new Stack<IHistoryItem>();
现在,当我尝试使用堆栈填充我的 ListView 时,它不显示任何项目:注意:没有错误/警告/异常,只是什么都没有。
this.lvHistory.ItemsSource = this.history;
但是,当我使用以下代码时,它可以工作:
this.lvHistory.ItemsSource = this.history.ToList();
真正的问题是:为什么会这样?
由于.ToList()
不与原始堆栈同步,因此每次堆栈更改时我都必须设置绑定,而不是调用lvHistory.UpdateLayout();
。 有没有更好的方法?
列表视图在 XAML 中如下所示:
<ListView Name="lvHistory" BorderBrush="{x:Null}" MinHeight="150">
<ListView.ItemTemplate>
<DataTemplate DataType="{x:Type history:IHistoryItem}">
<TextBlock Text="{Binding ListViewString}" />
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
IHistoryItem 看起来像这样:
public interface IHistoryItem
{
#region Events
event EventHandler ActionRedone;
event EventHandler ActionUndone;
#endregion
#region Properties
string ListViewString { get; }
#endregion
void Redo();
void Undo();
}
由于实现ObservableStack<T>
对于这个问题来说有点矫枉过正,所以我走上了另一条路。
这与Stack<T>
本身无关,而是ItemsSource
没有重新加载,因为它"仍然相同"。
这解决了该问题:
this.lvHistory.ItemsSource = null;
this.lvHistory.ItemsSource = this.history;
感谢@Clemens大开眼界。