Я провел некоторое исследование по этой теме, и пока я сталкивался с некоторыми возможностями, ничто не сработало для меня.Связывание списков не обновляет программные изменения
Детали:
Я работаю на приложение WPF, используя шаблон проектирования MVVM. В 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;
}
['BindingGroups'] (https://msdn.microsoft.com/en-us/library/system.windows.data.bindinggroup (v = vs.110) .aspx) создаются для сценария редактирования/возврата , Кроме того, первые две строки возврата выглядят одинаково. 'ObservableCollection' применим только в случае модификации самой коллекции (добавление, удаление, перемещение и т. Д.). –
@ H.B. Спасибо за вход; Я буду смотреть в «BindingGroups». Избыточность в 'RevertChanges' была из-за того, что я пытался использовать разные типы вещей, чтобы понять, что будет. Я его удалю. Спасибо за головы, хотя. – user3561813