【问题标题】:Adding items to ListView throws Catastrophic Failure exception将项目添加到 ListView 会引发 Catastrophic Failure 异常
【发布时间】:2013-01-27 18:51:26
【问题描述】:

我有这个列表视图和一个按钮:

<ListView x:Name="MyList" ItemsSource="{Binding}" Grid.Row="1"></ListView>
<Button x:Name="Add" Content="Add Item" Click="Add_Click" Grid.Row="2" />

我初始化一个字符串列表并将其分配给 ListView:

List<string> names;

private void FillListView()
{
    names = new List<string>();
    names.Add("Foo");
    MyList.DataContext = names;
}

private void Add_Click(object sender, RoutedEventArgs e)
{
    MyList.Items.Add("Bar");
}

还有一个处理程序可以向 ListView 添加一个字符串,但是当我单击按钮时,我得到 灾难性故障(HRESULT 的异常:0x8000FFFF (E_UNEXPECTED))

我也尝试将新字符串直接添加到集合中,如下所示:

private void Add_Click(object sender, RoutedEventArgs e)
{
    names.Add("Bar");
}

在这种情况下,ListView 没有更新,当我触摸它时,我得到 Value 不属于异常范围 0x80070057

如何将集合绑定到 ListView,然后添加更多项目?

【问题讨论】:

  • 像这样“btnAdd”重命名按钮我怀疑按钮名称会在编译器上产生混淆

标签: data-binding windows-8 windows-runtime


【解决方案1】:

通过您的 ViewModel 进行添加,而不是在 ListView 本身上添加,因此您的代码已失效:

private void Add_Click(object sender, RoutedEventArgs e)
{
    names.Add("Bar");
}

您只需将names 的类型从List 更改为ObservableCollection,以便在添加/删除项目时通知绑定引擎并将更改反映在UI 中。

    ObservableCollection<string> names;

    private void FillListView()
    {
        names = new ObservableCollection<string>();
        names.Add("Foo");
        MyList.DataContext = names;
    }

【讨论】:

  • 那行不通,名称必须是公共属性,也只是分配给数据上下文不起作用,您必须使用绑定
  • 它工作得很好(除非我测试它或提供我没有尝试过的免责声明,否则我不会发布代码)。在这里,names 是 Page 的属性,不是最好的设计,但很明显 OP 只是习惯了 MVVM 模型、数据绑定等,因此重构似乎脱离了上下文。此外,它确实使用了问题中提供的 XAML,我只是没有在我的回复中重复这一点。
  • names.Add("foo") 有效,MyList.Items.Add("Bar") 无效的任何原因?
  • MyList.Items.Add 工作正常,但不能与也使用绑定一起使用,这有点道理,因为将两者混合在一起就不清楚谁应该获胜。将数据上下文/绑定设置为在控件上设置“锁定”,以便其他适应它的途径失败。如果您在代码中向可视控件添加项目,您可能做错了:)
  • 抱歉,我不知道更改后的通知在没有绑定的情况下也能正常工作...我已更正:)
猜你喜欢
  • 2012-04-07
  • 2018-05-16
  • 2011-02-10
  • 1970-01-01
  • 1970-01-01
  • 2017-01-13
  • 1970-01-01
  • 1970-01-01
  • 2011-05-05
相关资源
最近更新 更多