我的viewModel中的comboBox逻辑遇到了一些问题。 viewModel填充comboBox,用户可以选择项目。
选择某个项目后,视图中会显示一些可编辑的信息,他们可以进行更改。现在,我想提示用户保存,如果进行了更改但未保存,并且他们正在尝试在下拉列表中选择另一个项目(“保存?”是/否/取消消息框)。
现在我需要记住之前选择的项目,如果用户选择取消,则通过重置所选项目来自行处理。由于comboBox没有PreviewSelectionChanged事件,因此这是我能想到处理此场景的唯一方法。它有效,但有一些混乱,有多个组合框等等。
我错过了什么,或者这只是需要做的事情?
答案 0 :(得分:2)
你必须在你的视图模型中创建一个名为isDirty
的标记或沿着这些标记的东西。
public class EditorViewModel
{
private bool _isDirty = false;
private long _editableProperty;
public long EditableProperty
{
get { return _editableProperty; }
set
{
_editableProperty = value;
// We've detected a change so mark this view model as dirty.
_isDirty = true;
}
}
}
请注意,如果您希望确保数据实际上与原始数据不同,则必须跳过几次箍。所以说某人意外地在EditableProperty
中添加一个空格并删除它,你的视图模型会认为它很脏并提示用户。
答案 1 :(得分:1)
Windows窗体ComboBox提供了SelectionChangeCommitted事件,但是对于WPF ComboBox控件,您可以更正,因为没有事件会在选择更改发生之前通知,这将为您提供取消事件的方法。
如果您要采用更改跟踪/可编辑方法,我建议您考虑对组合框项目源中的项目实施IChangeTracking和IEditableObject。
您可能必须处理SelectionChanged事件,检查removed items以确定先前选择的项目是否已被修改,然后显示请求确认的对话框。如果未指示/取消,则可以将所选索引设置回先前所选项目的索引。
答案 2 :(得分:0)
如何使可编辑项目成为项目的副本而不是实际项目?
所以你的ViewModel将包含
ObservableCollection<MyModel> ComboBoxItems;
int SelectedComboBoxIndex;
MyModel EditingItem;
每当PropertyChange
上发生SelectedComboBoxIndex
事件时,您都会检查EditingItem
是否为空。如果是null
,则表示您可以安全切换并设置
EditingItem = ComboBoxItem[SelectedComboBoxIndex]).Copy();
如果EditingItem
不为空,则会提示询问用户是否要保存更改或取消。
当用户点击“保存”时,它会使用EditingItem
并将更改应用于数据存储并更新ComboBoxItems
列表中的项目。
如果他们点击取消,则EditingItem
就会被丢弃。