Listview绑定不会更新程序化更改

时间:2016-07-21 15:32:33

标签: c# wpf mvvm

我已就这个主题做了一些研究,虽然我遇到了一些可能性,但没有任何对我有用。

详细信息:

我正在使用MVVM设计模式处理WPF应用。在ViewModel中,我有一个List Notes,一个具有一些属性的类(其中包括Note)。我已在SelectedNote上创建了一个属性VM来保留当前选定的音符。

在我的View中,我已将ListView控件绑定到列表QcNotes。我已将TextBox绑定到SelectedNote媒体资源。当我对TextBox进行更改时,它们会正确反映在ListView的相应行中。

问题:

我已经包含RevertChanges命令。这是一个相对简单的命令,可以解除我对笔记所做的更改。它正确更新TextBox,它实际上正确更新了基础列表,但更改不会更新ListView本身。 (在这种情况下是否有必要使用ObservableCollection?我已被要求尝试解决问题而不这样做。)

尝试修正

我尝试在NotifyPropertyChanged("SelectedNote")的调用中直接致电NotifyPropertyChanged("QcNotes")RevertChanges,但这并没有解决问题。

有什么想法吗?

XAML

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

ViewModel代码

public class MainViewModel : BaseViewModel
  { 
        private QcNote selectedNote;
        private string oldNoteForUpdating;
        private VMState currentState;
        private string noteInput;
        private IList<QcNote> qcNotes;

        public IList<QcNote> 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 => RevertChangestoNote());
            }
        }

        private void RevertChangestoNote()
        {
            QcNotes.First(q => q.Id == SelectedNote.Id).Note = oldNoteForUpdating;
            SelectedNote.Note = oldNoteForUpdating;
            NotifyPropertChanged("SelectedNote");
            NotifyPropertChanged("QcNotes");
            CurrentState = VMState.View;
        }

1 个答案:

答案 0 :(得分:0)

我会回答我自己的问题,但不要阻止其他人提出建议。

我在INotifyPropertyChanged课程上实施了Models.QcNote界面,解决了这个问题。最初,该接口仅在ViewModel上实现。在这种情况下,NotifyPropertyChanged仅在QcNote对象本身更改时调用,而不是在对象属性发生更改时调用。