【问题标题】:WPF, MVVM and comboboxWPF、MVVM 和组合框
【发布时间】:2011-07-01 03:22:26
【问题描述】:

我的 viewModel 中的组合框逻辑有些问题。 viewModel 填充组合框,用户可以选择项目。

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

现在我需要记住之前选择的项目,如果用户选择取消,我需要通过重置选择的项目自己处理这个问题。由于组合框没有 PreviewSelectionChanged 事件,这是我能想到的处理这种情况的唯一方法。它可以工作,但是当有多个组合框等时会变得有点混乱。

我是否遗漏了什么,或者这只是它需要做的方式?

【问题讨论】:

    标签: wpf mvvm


    【解决方案1】:

    您基本上必须在视图模型中创建一个名为 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 中添加了一个空格并将其删除,您的视图模型会认为它很脏并提示用户。

    【讨论】:

      【解决方案2】:

      Windows 窗体 ComboBox 提供了一个 SelectionChangeCommitted 事件,但对于 WPF ComboBox 控件,您需要更正,因为在选择更改发生之前不会通知任何事件,这将为您提供取消事件的方法。

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

      您可能必须处理SelectionChanged 事件,检查removed items 以确定先前选择的项目是否已被修改,然后显示一个请求确认的对话框。如果指示没有/取消,则可以将选定的索引设置回先前选定项的索引。

      【讨论】:

        【解决方案3】:

        如何让 Editable 项目成为项目的副本而不是实际项目?

        所以你的 ViewModel 将包含

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

        每当SelectedComboBoxIndex 上发生PropertyChange 事件时,您都会检查EditingItem 是否为空。如果是null,则表示您可以安全切换并设置

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

        如果EditingItem 不为空,那么您会提示询问用户是要保存更改还是要取消。

        当用户点击保存时,它会获取EditingItem 并将更改应用到数据存储并更新ComboBoxItems 列表中的项目。

        如果他们点击取消,EditingItem 将被简单地丢弃。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-12-05
          • 1970-01-01
          • 2014-03-30
          • 2012-02-29
          • 2018-05-03
          • 2017-02-02
          • 2015-09-15
          • 1970-01-01
          相关资源
          最近更新 更多