繁体   English   中英

在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>

我有这堂课

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM