【问题标题】:WPF ListView Binding issues with ObservableCollectionWPF ListView 绑定问题与 ObservableCollection
【发布时间】:2018-08-21 11:21:53
【问题描述】:

我有一个ListView,它绑定到一个名为GunsCollectionObservableCollection

<Grid>
<ListView x:Name="lstView" Height="300" ItemsSource="{Binding GunsCollection}">
    <ListView.View>
        <GridView>
            <GridViewColumn Header="Gun Name" Width="120" DisplayMemberBinding="{Binding ModelName}"/>
            <GridViewColumn Header="Price" Width="120" DisplayMemberBinding="{Binding UnitCost}"/>
        </GridView>
    </ListView.View>
</ListView>

当我在MainWindow 的构造函数中创建GunsCollection 的实例时,我的ListView 没有显示任何内容并且是空的。

public partial class MainWindow : Window
{
    public ObservableCollection<Gun> GunsCollection { get; set; } 
    public MainWindow()
    {
        InitializeComponent();
        this.DataContext = this;
        var GunsCollection = new ObservableCollection<Gun>() // doesn't work!
        {
            new Gun() {ModelName = "AK-47", UnitCost = 2700 },
            new Gun() {ModelName = "M4A4", UnitCost = 3100 },
        };
    }
}

但是当我在声明的同一行上创建 GunsCollection 的实例时,ListView 可以工作并显示包含的所有项目。

public partial class MainWindow : Window
{
    public ObservableCollection<Gun> GunsCollection { get; set; } = new ObservableCollection<Gun>(); 
    public MainWindow()
    {
        InitializeComponent();
        this.DataContext = this;
        GunsCollection.Add(new Gun() { ModelName = "AK-47", UnitCost = 2700 });
        GunsCollection.Add(new Gun() { ModelName = "M4A4", UnitCost = 3100 });
    }
}

为什么会这样?

【问题讨论】:

  • 在你的第一个例子中删除var(看起来像一个错字),然后将行设置设置为DataContext AFTER 设置GunsCollection 然后它应该可以工作。您的 GunsCollection 属性设置器不会引发 PropertyChanged 事件,因此顺序很重要。您的第二个示例有效,因为Add() 确实引发了CollectionChangedEvent(触发绑定更新),这就是使用ObservableCollection 时“可观察”的含义。
  • 我一开始没有看到var(是的,这是我的错误)。我确实在我的视图类中实现了 INotifyPropertyChanged,但是在 ObservableCollection 的属性设置器中引发 PropertyChanged 事件是我从未听说过的。我试试看,谢谢!
  • 是否实现 INotifyPropertyChanged 和绑定到 ObservableCollection&lt;T&gt; 与像 List&lt;T&gt; 这样的普通集合类型是单独的问题。第一个是当您想要设置属性触发绑定更新时,第二个是当您希望在更改集合中的项目时更新绑定(与集合属性本身因设置而改变无关)。

标签: c# wpf xaml


【解决方案1】:

您显示的第一个示例,您创建了一个新的局部变量,并且不将其分配给绑定到您的视图的公共集合。

public partial class MainWindow : Window
{
    public ObservableCollection<Gun> GunsCollection { get; set; } 
    public MainWindow()
    {
        InitializeComponent();
        this.DataContext = this;
        GunsCollection = new ObservableCollection<Gun>() 
        {
            new Gun() {ModelName = "AK-47", UnitCost = 2700 },
            new Gun() {ModelName = "M4A4", UnitCost = 3100 },
        };
    }
}

删除var

【讨论】:

  • 现在我注意到了这个愚蠢的错误,我希望我能把头埋在沙子里。谢谢你指出我的错误
  • @ZhenHao 别担心,尽情制作你的 CS 相关应用
【解决方案2】:

在您的第一个示例中,您用数据填充的 GunsCollection 在构造函数执行后将不再存在。您创建了一个与您的类属性无关的新变量(即使它具有相同的名称)。

【讨论】:

    猜你喜欢
    • 2017-09-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-26
    • 2011-08-27
    • 2013-10-16
    • 2023-03-25
    • 2011-06-20
    相关资源
    最近更新 更多