在C#WPF中向ListView GridView添加项

在C#WPF中向ListView GridView添加项,c#,wpf,gridview,listviewitem,C#,Wpf,Gridview,Listviewitem,您好,我在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 > <

您好,我在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>
在主窗口课上我做了这个

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();
 }
List num=new List();
私有void AddToList(字符串路径)
{
字符串a1=“a1”+路径;
字符串b1=“b1”+路径;
字符串c1=“c1”+路径;
num.Add(new numbz(){No1=a1,No2=a2,No3=a3});
}
私有无效RfrshLstVw()
{
List_To_Lock.ItemsSource=num;
}
私有无效添加\单击(对象发送者,路由目标)
{
AddToList(textbox.text);
RfrshLstVw();
}
当我单击上面调用最新方法的add按钮时,在
列表视图中添加项目
但是,当我更改文本框的内容,并且
列表视图中有一个项目时,它不会添加下一个项目。

我怎样才能解决这个问题

当您再次将同一集合分配给items源时,WPF将不会刷新ListView。有不同的方法可以实现您想要的,但是最好的方法是使用
可观察收集
而不是
列表
。在这种情况下,您甚至不需要刷新方法,因为只要向可观察集合添加新项目,
列表视图将自动更新。

当您再次将相同集合分配给项目源时,WPF将不会刷新列表视图。有不同的方法可以实现您想要的,但是最好的方法是使用
可观察收集
而不是
列表
。在这种情况下,您甚至不需要使用刷新方法,因为只要向可观察集合添加新项,
列表视图将自动更新。

要进一步展开,WPF将侦听来自
INotifyPropertyChanged
的事件(对于持有列表的对象)或者从
INotifyCollectionChanged
(对于列表本身)

本着MVVM的精神,我使用了实现<代码>INotifyPropertyChanged
接口的ViewModels,并将其分配给视图的DataContext属性,这样当ListView绑定到视图中的列表(即
)时,WPF将看到ViewModel是<代码>INotifyPropertyChanged
。然后它将开始侦听属性何时更改

但即使这样,WPF也不会注意到列表中的更改,只会在您交换列表本身时注意到更改。如果要让它拾取列表中的更改,则必须确保绑定到的属性每次访问时都返回列表的不同实例

例如,通过使list属性在每次访问时生成一个新的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
}
公共类视图模型:INotifyPropertyChanged
{
公共事件属性更改事件处理程序属性更改;
私有只读列表_internalList;
public IEnumerable ListProperty=>\u internalList.AsEnumerable();
//此处的其他代码,包括在希望WPF刷新到ListProperty的任何绑定时引发“PropertyChanged”事件的代码
}
…然后,当ViewModel为
ListProperty
属性触发
PropertyChanged
事件时,WPF将再次查看它,确定它是不同的引用,并使用新的IEnumerable刷新自身


但正如他所说,最好的方法是使用一个
可观察的集合。当列表中有大量项目时,效率会更高。。。然后WPF将选择更改,而不必刷新整个列表

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

该事件准确地告诉WPF发生了哪些更改,从而省去了重新加载整个列表的麻烦。

进一步说,WPF正在侦听来自
inotifPropertyChanged
(对于保存列表的对象)或
inotifCollectionChanged
(对于列表本身)的事件

本着MVVM的精神,我使用了实现<代码>INotifyPropertyChanged
接口的ViewModels,并将其分配给视图的DataContext属性,这样当ListView绑定到视图中的列表(即
)时,WPF将看到ViewModel是<代码>INotifyPropertyChanged
。然后它将开始侦听属性何时更改

但即使这样,WPF也不会注意到列表中的更改,只会在您交换列表本身时注意到更改。如果要让它拾取列表中的更改,则必须确保绑定到的属性每次访问时都返回列表的不同实例

例如,通过使list属性在每次访问时生成一个新的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
}
公共类视图模型:INotifyPropertyChanged
{
公共事件属性更改事件处理程序属性更改;
私有只读列表_internalList;
public IEnumerable ListProperty=>\u internalList.AsEnumerable();
//此处的其他代码,包括在希望WPF刷新到ListProperty的任何绑定时引发“PropertyChanged”事件的代码
}
…然后,当ViewModel为
ListProperty
属性触发
PropertyChanged
事件时,WPF将再次查看它,确定它是不同的引用,并使用新的IEnumerable刷新自身


但正如他所说,最好的方法是使用一个
可观察的集合。当列表中有大量项目时,效率会更高。。。然后WPF将选择更改,而不必刷新整个列表

可观测采集的工作方式是通过im