WPF,MVVM和组合框

3

我在viewModel中的comboBox逻辑上遇到了一些麻烦。viewModel会填充comboBox并允许用户选择项目。

当选择一个项目时,视图中会出现可编辑的信息,并且用户可以进行更改。现在,如果用户正在尝试选择下拉菜单中的另一个项目,而之前所做的更改未保存,则我想提示用户保存(一个“保存?”是/否/取消的messageBox)。

目前,我需要记住先前选择的项目,并在用户选择取消时自己处理重置选定项目。由于comboBox没有PreviewSelectionChanged事件,这是我能想到的应对此场景的唯一方法。它有效,但在有多个comboBoxes等情况下可能会有点混乱。

我是否遗漏了什么,或者这就是必须完成的方式?

3个回答

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 中意外添加了一个空格并将其删除,您的视图模型将认为它已被修改并提示用户。请注意不要解释,并保留HTML标签。

1

Windows Forms ComboBox提供了SelectionChangeCommitted事件,但对于WPF ComboBox控件,您是正确的,没有事件会在选择更改发生之前通知您,这将为您提供取消事件的方法。

如果您要采用更改跟踪/可编辑方法,请考虑在组合框项源中的项目上实现IChangeTrackingIEditableObject

你可能需要处理SelectionChanged事件,检查删除的项以确定之前选择的项目是否已被修改,然后显示一个对话框请求确认。如果指示了“否”或“取消”,则可以将所选索引设置回以前所选项目的索引。

0

把可编辑项目做成一个条目的副本而不是实际的条目怎么样?

这样您的ViewModel就会包含:

ObservableCollection<MyModel> ComboBoxItems;
int SelectedComboBoxIndex;
MyModel EditingItem;

每当在SelectedComboBoxIndex上发生PropertyChange事件时,您会检查并查看EditingItem是否为null。如果它是null,那么就意味着您可以安全地切换并设置:

EditingItem = ComboBoxItem[SelectedComboBoxIndex]).Copy();

如果EditingItem不为null,则会弹出提示询问用户是否要保存更改或取消。
当用户点击保存时,它会获取EditingItem并将更改应用于数据存储,并更新ComboBoxItems列表中的项目。
如果他们点击取消,则EditingItem将被简单地丢弃。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接