2016-07-21 2 views
1

Я провел некоторое исследование по этой теме, и пока я сталкивался с некоторыми возможностями, ничто не сработало для меня.Связывание списков не обновляет программные изменения

Детали:

Я работаю на приложение WPF, используя шаблон проектирования MVVM. В ViewModel у меня есть ListNotes, класс с несколькими свойствами (среди них 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

['BindingGroups'] (https://msdn.microsoft.com/en-us/library/system.windows.data.bindinggroup (v = vs.110) .aspx) создаются для сценария редактирования/возврата , Кроме того, первые две строки возврата выглядят одинаково. 'ObservableCollection' применим только в случае модификации самой коллекции (добавление, удаление, перемещение и т. Д.). –

+0

@ H.B. Спасибо за вход; Я буду смотреть в «BindingGroups». Избыточность в 'RevertChanges' была из-за того, что я пытался использовать разные типы вещей, чтобы понять, что будет. Я его удалю. Спасибо за головы, хотя. – user3561813

ответ

0

Я отправлю ответ на свой вопрос, но не хочу, чтобы удержать других от предоставления предложений.

Я внедрил интерфейс INotifyPropertyChanged на свой класс Models.QcNote, и это решило проблему. Первоначально интерфейс реализовывался исключительно на ViewModel. В этом случае NotifyPropertyChanged был вызван только тогда, когда был изменен объект QcNote, а не когда свойства объекта были изменены.

Смежные вопросы