Windows 10开发:如何在ListView中的项目发生更改时刷新ListView?

3

我对数据绑定的概念非常陌生,我不认为我完全理解它。我有一个名为Project的类,其中包含一个类型为ToDoLinkedList作为其属性之一。当我导航到Project的一个实例时,我将在ListView中显示ToDo类型的LinkedList。我创建了函数,允许我更改LinkedList中节点的顺序(向上移动、向下移动)并删除所选节点。我希望每当LinkedList发生更改(向上移动、向下移动或删除)时,ListView都会刷新。然而,我无法做到这一点。以下是我的代码:(未包括所有部分)

页面的XAML:

<ListView x:Name="myListView" ItemsSource="{Binding Source={StaticResource ToDos}, Mode=TwoWay}">    
    <ListView.ItemTemplate>
        <DataTemplate>
            <StackPanel>
                <CheckBox x:Name="myCheckBox" 
                          Content="{Binding ToDoTitle, Mode=TwoWay}" 
                          IsChecked="{Binding IsCompleted, Mode=TwoWay}">                         
            </StackPanel>
        </DataTemplate>
    </ListView.ItemTemplate>      
</ListView>

C# 数据模型:

public class ToDo : INotifyPropertyChanged
{
    private string toDoTitle;
    private bool isCompleted;
    public event PropertyChangedEventHandler PropertyChanged = delegate { };
    public string ToDoTitle { get { return this.toDoTitle; } set { this.toDoTitle = value; this.OnPropertyChanged(); } }
    public bool IsCompleted { get { return this.isCompleted; } set { this.isCompleted = value; this.OnPropertyChanged(); } }

    public void OnPropertyChanged([CallerMemberName] string propertyName = null)
    {
        // Raise the PropertyChanged event, passing the name of the property whose value has changed.
        this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
    }

}

public class Projects : INotifyPropertyChanged
{
    private LinkedList<ToDo> toDos;

    public event PropertyChangedEventHandler PropertyChanged = delegate { };

    public LinkedList<ToDo> ToDos { get { return this.toDos; } set { this.toDos = value; this.OnCollectionChanged(); } }

    public Projects()
    {
        ToDos = new LinkedList<ToDo>();

    }
    public void OnPropertyChanged([CallerMemberName] string propertyName = null)
    {
        // Raise the PropertyChanged event, passing the name of the property whose value has changed.
        this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName));
    }
}

谢谢。
1个回答

0

首先我建议您了解MVVM,并尝试跟随一些基本的教程,例如这个

您可以使用MVVM Light,以避免在最初时自己管理INotifyPropertyChanged (但是真正了解MVVM Light如何工作还是很好的)。

回到您的问题,您当前的代码仅在设置完整的ToDos列表时通知。如果您想要了解列表中的任何更改(查看添加/删除/更新项时),您可能正在寻找ObservableCollection而不是LinkedList。

希望能帮到您。


我同意 - 最快的解决方案是用 ObservableCollection<ToDo> 替换 LinkedList<ToDo>。它实现了与 INotifyPropertyChanged 类似的接口:INotifyCollectionChanged - Manfred Radlwimmer
@ManfredRadlwimmer 所以,我尝试了这个方法:继续使用LinkedList,添加了一个ObservableCollection,该集合从LinkedList导入值,并将此ObservableCollection绑定到我的ListView。然而,在使用断点分析应用程序运行时,我发现修改LinkedList(添加/删除/更新)不会触发OnPropertyChanged,因为get和set访问器没有被触发。所以,我尝试在进行修改(添加/删除/更新)时直接调用OnPropertyChanged。OnProperyChanged函数执行了,但UI没有改变。 - pomeloyou
@ManfredRadlwimmer 当执行OnPropertyChanged函数时,ListView应该被刷新,对吗? - pomeloyou
@ManfredRadlwimmer 我解决了自己的问题!我可以保留我的链表而不使用observablecollection或INotifyPropertyChanged或MVVM Light。在每次修改链表后,需要刷新ListView时,我只需将CollectionViewSource.Source再次设置为链表即可。这可能不是最优雅的解决方案,但我正在赶截止日期。我会进一步阅读有关MVVM Light和ObservableCollection的内容,以加深我的数据绑定理解。感谢您的帮助。:D - pomeloyou
感谢Manfred Radlwimmer,很高兴你找到了解决方案pomeloyou。正如你所注意到的那样,这并不是最优雅的解决方案,但至少你可以得到一个想法:如果你更新完整的数据源,它将通知UI。 - Ouarzy
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接