在 C# WPF 中将项目添加到 ListView GridView

Adding items to ListView GridView in C# WPF

您好,我在 XAML

中有这个 Listview GridView
<ListView FontSize="10" Name="List_To_Lock" Grid.Row="3"  Background="DarkGray" Grid.Column="1" Grid.RowSpan="2" Grid.ColumnSpan="4" Margin="4">
    <ListView.View>
        <GridView  >
            <GridView.Columns>
                <GridViewColumn  Header="No1" Width="40" DisplayMemberBinding="{Binding No1}"/>
                <GridViewColumn Header="No2" Width="150" DisplayMemberBinding="{Binding No2}"/>
                <GridViewColumn Header="No3" Width="280" DisplayMemberBinding="{Binding No3}"/>
            </GridView.Columns>
        </GridView>
    </ListView.View>
</ListView>

我有这个 class

public class numbz
{
    public string No1 { get; set; }
    public string No2 { get; set; }
    public string no3 { get; set; }


}

并且在主窗口中 class 我这样做了

List<numbz> num = new List<numbz>();
private void AddToList(string path)
{
    string a1= "a1"+path;
    string b1= "b1"+path;
    string c1= "c1"+path;
    num.Add(new numbz() { No1 = a1, No2 = a2, No3 = a3 });
}

private void RfrshLstVw()
{
    List_To_Lock.ItemsSource = num;
}

 private void Add_Click(object sender, RoutedEventArgs e)
 {

    AddToList(textbox.text);
    RfrshLstVw();
 }

当我单击调用上面最新方法的添加按钮时,它会在 listview 上添加项目 但是当我更改文本框的内容并且 listview 中有一个项目时,它不会添加下一个项目。 我该如何解决?

当您再次将同一个集合分配给项目源时,WPF 将不会刷新 ListView。有多种方法可以实现您想要的效果,但最好的方法是使用 ObservableCollection<T> 而不是 List<T>。在这种情况下,您甚至不需要刷新方法,因为一旦您向可观察集合添加新项目,ListView 就会自动更新。

为了扩展 ,WPF 正在侦听来自 INotifyPropertyChanged(对于持有列表的事物)或来自 INotifyCollectionChanged(在列表本身的情况)。

本着 MVVM 的精神,我使用了实现 INotifyPropertyChanged 接口的 ViewModel,并将它们分配给视图的 DataContext 属性,这样当例如ListView 绑定到视图内的列表(即 <ListView ItemsSource="{Binding ListProperty}"/>),然后 WPF 将看到 ViewModel 是一个 INotifyPropertyChanged。然后它将开始侦听 属性 何时发生变化。

但即便如此,WPF 也不会接受列表内部的更改,只有当您换出列表本身。如果你想让它获取列表中的更改,那么你必须确保 属性 每次访问时都绑定到 returns 列表的不同实例。

例如,通过使列表 属性 在每次访问时生成一个新的 IEnumerable:

public class ViewModel : INotifyPropertyChanged
{
    public event PropertyChangedEventHandler PropertyChanged;
    private readonly List<string> _internalList;
    public IEnumerable ListProperty => _internalList.AsEnumerable();
    // Other code here, including code to raise the "PropertyChanged" event when you want WPF to refresh any bindings to the ListProperty
}

...然后当 ViewModel 触发 ListProperty 属性 的 PropertyChanged 事件时,WPF 将再次查看它,发现它是一个不同的引用,并将使用新的 IEnumerable 刷新自身。


但正如他所说,最好的方法是使用 ObservableCollection。当列表中有大量项目时,这会更有效率......然后 WPF 将挑选更改,而不必刷新整个列表。

ObservableCollection 的工作方式是实现 INotifyCollectionChanged 接口。只要列表中的任何内容发生变化(例如,当添加、移动、替换或移动某些内容时),它都会引发一个事件。 WPF 将看到该列表是一个 INotifyCollectionChanged 并将自动开始侦听该事件。

该事件准确地告诉 WPF 发生了什么变化在哪里,这样就省去了重新加载整个列表的麻烦。