我正在尝试使用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()
与原始Stack不同步,因此每次Stack更改时我都必须设置绑定,而不是调用lvHistory.UpdateLayout();
。有更好的方法吗?
ListView在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();
}
答案 0 :(得分:0)
由于实现了ObservableStack<T>
对于此问题有点过大,所以我走了另一条路。
它与Stack<T>
本身没有任何关系,但是ItemsSource
并未重新加载,因为它仍然“相同”。
这可以解决该问题:
this.lvHistory.ItemsSource = null;
this.lvHistory.ItemsSource = this.history;
感谢@Clemens令人大开眼界。