[英]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>
我有这堂课
public class numbz
{
public string No1 { get; set; }
public string No2 { get; set; }
public string no3 { get; set; }
}
在MainWindow类中,我做到了
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的答案 ,WPF正在侦听来自INotifyPropertyChanged
(对于持有列表的事物)或INotifyCollectionChanged
(对于列表本身)的事件。
本着MVVM的精神,我使用了实现INotifyPropertyChanged
接口的ViewModel,并将其分配给View的DataContext属性,以便例如将ListView绑定到视图内的列表时(即<ListView ItemsSource="{Binding ListProperty}"/>
),则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
}
...然后,当ViewModel触发ListProperty
属性的PropertyChanged
事件时,WPF将再次查看它,发现它是一个不同的引用,并使用新的IEnumerable刷新自身。
但是最好的方法是使用ObservableCollection
,正如他所说。 当列表中有成千上万的项目时,效率会更高……然后WPF将选择更改,而不必刷新整个列表。
ObservableCollection
工作方式是通过实现INotifyCollectionChanged
接口。 只要列表中的任何内容发生更改(例如,添加,移动,替换或移动某些内容),它都会引发一个事件。 WPF将看到该列表是一个INotifyCollectionChanged
,并将自动开始侦听该事件。
该事件告诉WPF确切的地方更改了什么,从而避免了重新加载整个列表的麻烦。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.