我已就这个主题做了一些研究,虽然我遇到了一些可能性,但没有任何对我有用。
详细信息:
我正在使用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;
}
答案 0 :(得分:0)
我会回答我自己的问题,但不要阻止其他人提出建议。
我在INotifyPropertyChanged
课程上实施了Models.QcNote
界面,解决了这个问题。最初,该接口仅在ViewModel
上实现。在这种情况下,NotifyPropertyChanged
仅在QcNote
对象本身更改时调用,而不是在对象属性发生更改时调用。