【问题标题】:WPF listbox removing item properlyWPF列表框正确删除项目
【发布时间】:2016-09-20 17:45:24
【问题描述】:

您好,我正在制作一个 WPF 应用程序,但遇到了 listbox/listview 的问题,MVVM 已实现。我正在创建一个显示在listbox 上的类列表,并且我正在通过在listbox 中选择一个项目来编辑项目。问题是当我删除一个项目时,它不会触发 UI 的 onpropertychanged 事件,但是在代码中工作,值是正确的。当我关闭窗口并重新打开它时,列表会更新,但在删除项目时不会直接更新,由于某种原因它永远不会触发 onpropertychanged 事件。

它确实可以像

那样过滤快速笔记列表
quicknotelist = quicknotelist.where(x => x.id != selecteditem.id); 

虽然它只工作一次,并且 UI 更新但是 selecteditem 似乎无法正常工作,即使我声明了

selecteditem = new quicknote() {*values*};

部分相关代码,我用的是INotifyPropertyChanged

  private QuickNote selectedNote = new QuickNote();  // weeeeeee
    public QuickNote SelectedNote
    {
        get
        {
            return selectedNote;
        }
        set
        {
            if (SelectedNote != null)
            {
                selectedNote = value;
                OnPropertyChanged("SelectedNote");
                EnableEditNoteBox = true;
            }
        }
    }

    private List<QuickNote> quickNoteList = new List<QuickNote>();
    public List<QuickNote> QuickNoteList
    {
        get { return quickNoteList; }
        set { quickNoteList = value; OnPropertyChanged("QuickNoteList");  }
    } 

这里是删除项目的方法

private void DeleteNote(object obj)
    {
        if (SelectedNote != null) 
        {
            QuickNoteList.Remove(SelectedNote); 
   // I want this to trigger       onpropertychanged without using myclasslist = newclasslist; since it messes up selecteditem to null.

         }
     }

这里是 xaml 部分。

 <ListBox
    Width="713"
    Height="230"
    SelectedItem="{Binding SelectedNote, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}"
    ItemsSource="{Binding QuickNoteList,BindsDirectlyToSource=True, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}"
    DisplayMemberPath="Notes"
    Foreground="Black"
    ScrollViewer.VerticalScrollBarVisibility="Visible"
    ScrollViewer.HorizontalScrollBarVisibility="Disabled"
    ScrollViewer.CanContentScroll="False"/>    

【问题讨论】:

    标签: wpf listview mvvm listbox


    【解决方案1】:

    如果可以的话,我会发表评论。您应该查找 ObservableCollection。我觉得 QuickNoteList 应该属于这种类型。

    【讨论】:

    • 我知道 ObservableCollection 但结果是一样的,使用 INotifypropertyChanged 很像 ObservableCollection。我确实尝试过使用 ObservableCollection,但它的作用几乎相同。 codeproject.com/Articles/42536/…
    • @Lucy 您应该使用ObservableCollection,它会在添加或删除项目时自动告诉 UI 中的绑定“此集合已更改,因此请重绘您自己”。请注意,这与 INotifyPropertyChanged 不同,后者仅在属性从一个值更改为另一个值时触发。您可能缺少的第二件事是看起来您正在为选定的 id 创建一个新的 QuickNote 对象...这不起作用,因为默认情况下,WPF 按引用比较对象,因此列表中对 QuickNote 的引用是不同于新创建的参考
    • 什么是 QuickNote?
    • 实现了 ObservableCollection 并以我提到的第二个问题告终。它只工作一次,selecteditem 将变为 null,即使我在 remove 方法后执行类似的操作,SelectedNote = new Quicknote() {Values };
    • 如果 (SelectedNote != null) 应该是 if (SelectedNote != value) 吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多