WPF,MVVM和组合框

时间:2011-06-29 21:05:04

标签: wpf mvvm

我的viewModel中的comboBox逻辑遇到了一些问题。 viewModel填充comboBox,用户可以选择项目。

选择某个项目后,视图中会显示一些可编辑的信息,他们可以进行更改。现在,我想提示用户保存,如果进行了更改但未保存,并且他们正在尝试在下拉列表中选择另一个项目(“保存?”是/否/取消消息框)。

现在我需要记住之前选择的项目,如果用户选择取消,则通过重置所选项目来自行处理。由于comboBox没有PreviewSelectionChanged事件,因此这是我能想到处理此场景的唯一方法。它有效,但有一些混乱,有多个组合框等等。

我错过了什么,或者这只是需要做的事情?

3 个答案:

答案 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控件,您可以更正,因为没有事件会在选择更改发生之前通知,这将为您提供取消事件的方法。

如果您要采用更改跟踪/可编辑方法,我建议您考虑对组合框项目源中的项目实施IChangeTrackingIEditableObject

您可能必须处理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就会被丢弃。