Listview Binding Does Not Update Programmatic Changes
<p>I've done some research on the topic, and while I've come across some possibilities, nothing has worked for me.</p>

<p><strong>Details:</strong></p>

<p>I'm working on a WPF app using an MVVM design pattern. In the ViewModel, I have a <code>List</code> of <code>Notes</code>, a class with a few properties (among them, <code>Note</code>). I've created a property, <code>SelectedNote</code> on the <code>VM</code> to hold the currently selected note. </p>

<p>In my <code>View</code>, I've bound a <code>ListView</code> control to the list <code>QcNotes</code>. I've bound a <code>TextBox</code> to the <code>SelectedNote</code> property. When I make changes to the <code>TextBox</code>, they are correctly reflected in the appropriate row of the <code>ListView</code>. </p>

<p><strong>Problem:</strong></p>

<p>I've include a <code>RevertChanges</code> command. This is a relatively simple command that undoes changes I've made to the note. It correctly updates the <code>TextBox</code>, and it actually updates the underlying list correctly, but the changes do not update the <code>ListView</code> itself. (Is it necessary to use an <code>ObservableCollection</code> in this circumstance? I've been asked to try and resolve the problem without doing so).</p>

<p><strong>Attempted Fixes</strong></p>

<p>I tried to call <code>NotifyPropertyChanged("SelectedNote")</code> and <code>NotifyPropertyChanged("QcNotes")</code> directly from within the call to <code>RevertChanges</code>, but that hasn't fixed the problem.</p>

<p>Any ideas?</p>

<p><strong>XAML</strong></p>

<pre><code>&lt;Window.DataContext&gt;
    &lt;VM:MainProjectViewModel /&gt;
&lt;/Window.DataContext&gt;
&lt;Grid&gt;
    &lt;StackPanel&gt;
        &lt;ListView ItemsSource="{Binding QcNotes, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}" x:Name="list" SelectedItem="{Binding SelectedNote}"&gt;
            &lt;ListView.View&gt;
                &lt;GridView&gt;
                    &lt;GridViewColumn Header="Note" DisplayMemberBinding="{Binding Note}" /&gt;
                &lt;/GridView&gt;
            &lt;/ListView.View&gt;
        &lt;/ListView&gt;
        &lt;TextBox
          Height="30"
          HorizontalAlignment="Stretch"
          Text="{Binding SelectedNote.Note, UpdateSourceTrigger=PropertyChanged, Mode=TwoWay}"
        /&gt;
        &lt;StackPanel Orientation="Horizontal" HorizontalAlignment="Center"&gt;
        &lt;Button Content="Allow Edits" Command="{Binding ChangeStateToAllowEditsCommand}" /&gt;
        &lt;Button Content="Save Changes" Command="{Binding EditNoteCommand}" /&gt;
        &lt;Button Content="Revert Changes" Command="{Binding RevertChangesToNoteCommand}" /&gt;
        &lt;/StackPanel&gt;
    &lt;/StackPanel&gt;
&lt;/Grid&gt;
</code></pre>

<p><strong>ViewModel Code</strong></p>

<pre><code>public class MainViewModel : BaseViewModel
  { 
        private QcNote selectedNote;
        private string oldNoteForUpdating;
        private VMState currentState;
        private string noteInput;
        private IList&lt;QcNote&gt; qcNotes;

        public IList&lt;QcNote&gt; QcNotes
        {
            get
            {
                return qcNotes;
            }
            set
            {
                qcNotes = value;
                NotifyPropertChanged();
            }
        }

        public QcNote SelectedNote
        {
            get
            {
                return selectedNote;
            }
            set
            {
                selectedNote = value;
                oldNoteForUpdating = SelectedNote.Note;
                NotifyPropertChanged();
            }
        }

        public VMState CurrentState
        {
            get
            {
                return currentState;
            }
            set
            {
                currentState = value;
                NotifyPropertChanged();
            }
        }

        public ICommand RevertChangesToNoteCommand
        {
            get
            {
                return new ActionCommand(o =&gt; RevertChangestoNote());
            }
        }

        private void RevertChangestoNote()
        {
            QcNotes.First(q =&gt; q.Id == SelectedNote.Id).Note = oldNoteForUpdating;
            SelectedNote.Note = oldNoteForUpdating;
            NotifyPropertChanged("SelectedNote");
            NotifyPropertChanged("QcNotes");
            CurrentState = VMState.View;
        }
</code></pre>