ListView不接受Stack,但可以使用List

时间:2018-08-23 09:37:12

标签: c# wpf listview data-binding

我正在尝试使用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();
}

1 个答案:

答案 0 :(得分:0)

由于实现了ObservableStack<T>对于此问题有点过大,所以我走了另一条路。
它与Stack<T>本身没有任何关系,但是ItemsSource并未重新加载,因为它仍然“相同”。
这可以解决该问题:

this.lvHistory.ItemsSource = null;
this.lvHistory.ItemsSource = this.history;

感谢@Clemens令人大开眼界。