在 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 发生了什么变化在哪里,这样就省去了重新加载整个列表的麻烦。
您好,我在 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
就会自动更新。
为了扩展 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 发生了什么变化在哪里,这样就省去了重新加载整个列表的麻烦。