添加项目的ListView GridView控件在C#WPF

问题描述:

你好,我在XAML添加项目的ListView GridView控件在C#WPF

这个列表视图的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> 

,我有这个类

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


} 

,并在主窗口类我做到了这一点

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就会自动更新。

要扩大Pavel's answer,WPF监听针对来自任何一个INotifyPropertyChanged(在持有列表中的事情的情况下)的事件或从INotifyCollectionChanged(列表本身的情况下)。

本着MVVM的精神,我使用实现了INotifyPropertyChanged接口的ViewModel,并将它们分配给View的DataContext属性,以便在例如ListView绑定到视图内的列表(即<ListView ItemsSource="{Binding ListProperty}"/>),那么WPF将看到ViewModel是INotifyPropertyChanged。然后它会开始监听财产何时更改。

但即使有,当你换出列表本身 WPF不会挑上的变化列表中,只有变化。如果你想让它在列表中找到更改,那么你必须确保你绑定的属性在每次访问时都返回一个不同的列表实例。

例如,通过将列表属性生成它的访问新的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 
} 

...然后在视图模型触发关闭PropertyChanged事件的ListProperty财产,WPF将就一下吧再次,看到它是一个不同的参考,并将使用新的IEnumerable进行自我刷新。


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

ObservableCollection的工作方式是通过实现INotifyCollectionChanged接口。无论何时列表中的任何内容发生变化(例如,添加,移动,替换或移动内容时),都会引发事件。 WPF会看到该列表是一个INotifyCollectionChanged,并且会自动开始监听该事件。

该事件告诉WPF到底发生了什么变化,从而节省了重新加载整个列表的麻烦。

+0

如果有其他人以这种方式出现,这种解释是正确的。 但是,应该注意,如果项目被修改,NotifyCollectionChanged事件不会触发。 –